Поделиться через


Практическое руководство. Идентификация обнуляемого типа (Руководство по программированию на C#)

Обновлен: Ноябрь 2007

Оператор C# typeof может использоваться для создания объекта Type, представляющего обнуляемый тип:

System.Type type = typeof(int?);

Также можно использовать классы и методы пространства имен System.Reflection для создания объектов Type, представляющих обнуляемые типы. Однако при попытке получить информацию о типе от обнуляемых переменных во время выполнения, используя метод GetType или оператор is, результатом является объект Type, представляющий базовый тип, а не сам обнуляемый тип.

Вызов GetType для обнуляемого типа приводит к выполнению операции упаковки-преобразования в момент неявного преобразования типа в Object. Таким образом, GetType всегда возвращает объект Type, представляющий базовый тип, а не обнуляемый тип.

  int? i = 5;
  Type t = i.GetType();
  Console.WriteLine(t.FullName); //"System.Int32"

Оператор C# is также работает с базовым типом для обнуляемого типа. Поэтому нельзя использовать is для определения, является ли тип переменной обнуляемым. В следующем примере показано, что оператор is рассматривает обнуляемую переменную<int> просто как "int".

  static void Main(string[] args)
  {
    int? i = 5;
    if (i is int) // true
      //…
  }

Пример

Чтобы определить, представляет ли объект Type обнуляемый тип, используйте следующий код. Помните, что код всегда возвращает значение "false", если объект Type был возвращен из вызова GetType, как описано ранее в этом разделе.

if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) {…}

См. также

Ссылки

Типы, допускающие значения NULL (руководство по программированию на C#)

Упаковка типов, допускающих значения NULL (Руководство по программированию на C#)