Практическое руководство. Идентификация обнуляемого типа (Руководство по программированию на 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#)