Ответ 1
GetType()
- метод object
.
Чтобы вызвать его, структура Nullable<T>
должна быть помещена в коробку.
Вы можете увидеть это в коде IL:
//int? x = 5;
IL_0000: ldloca.s 00
IL_0002: ldc.i4.5
IL_0003: call System.Nullable<System.Int32>..ctor
//Console.WriteLine(x.GetType());
IL_0008: ldloc.0
IL_0009: box System.Nullable<System.Int32>
IL_000E: callvirt System.Object.GetType
IL_0013: call System.Console.WriteLine
Неверные типы обрабатываются специально CLR; невозможно иметь экземпляр с боксами с нулевым типом.
Вместо этого в боксе с нулевым типом будет отображаться нулевая ссылка (если HasValue
- false) или значение в боксе (если есть значение).
Следовательно, команда box System.Nullable<System.Int32>
приводит к коробке Int32
, а не коробке Nullable<Int32>
.
Поэтому для GetType()
невозможно вернуть Nullable<T>
.
Чтобы это было более ясно, посмотрите на следующий код:
static void Main()
{
int? x = 5;
PrintType(x);
}
static void PrintType<T>(T val) {
Console.WriteLine("Compile-time type: " + typeof(T));
Console.WriteLine("Run-time type: " + val.GetType());
}
Отпечатает
Тип времени компиляции: System.Nullable`1 [System.Int32]
Тип времени выполнения: System.Int32