Этот пример немного запутан, потому что:
int? x = 1;
создает Nullable<int>
, как вы ожидаете;однако:
Type tupe = x.GetType();
- это вызов невиртуального метода в object
, который не (и не может быть) переопределен - поэтому это операция boxing ;и Nullable<T>
имеет специальные правила бокса:
- , если он пуст, он устанавливает
null
- , если он имеет значение, значение равнов штучной упаковке и возвращается
т.е.
int? x = 1;
int y = 1;
коробка точно то же самое.
Следовательно, вы передаете typeof(int)
вGetUnderlyingType
.
Более наглядный пример того, когда это помогает, при использовании отражения:
class Foo {
public int? Bar {get;set;}
}
...
Type type = typeof(Foo); // usually indirectly
foreach(var prop in type.GetProperties()) {
Type propType = prop.PropertyType,
nullType = Nullable.GetUnderlyingType(propType);
if(nullType != null) {
// special code for handling Nullable<T> properties;
// note nullType now holds the T
} else {
// code for handling other properties
}
}