Nullable不是ValueType

时间:2011-07-13 03:56:16

标签: c# nullable

如果您查看.NET Nullable的文档,您将看到:

   struct Nullable<T>

请注意,它是 struct ,而不是类。

似乎struct Nullable<T> 是ValueType,这是非常意外的。以下代码打印False:

   Type nullableType = typeof(Nullable<int>);
   Console.WriteLine(nullableType is ValueType);

如果查看生成的IL,您会看到编译器在编译时确定nullableType为ValueType。但如果它是一个结构,它怎么可能是ValueType?所有结构都是ValueTypes,对吗?显然,它与泛型有关。

我在这里缺少什么?语言规范中是否有关于此的内容?

感谢。

3 个答案:

答案 0 :(得分:15)

您正在测试System.Type是否为值类型。它不是。像这样改写:

Nullable<int> test = 42;
Console.WriteLine(test is ValueType);

答案 1 :(得分:12)

这是一种价值类型,请尝试这种方式:

Type nullableType = typeof(Nullable<int>);
Console.WriteLine(nullableType.IsValueType);

应该返回true。希望有所帮助。

答案 2 :(得分:2)

Nullable<T>是一个通用的类型系列,它遵循既不是值类型也不是类类型的规则。用于检查对象类型的运行时方法需要装箱。如果HasValue的{​​{1}}属性为Nullable<T>,则尝试将其分解后会将其分解为true并将其分解。否则,尝试将其装箱将产生T。在任何情况下都不会将其装箱为null。可以为Nullable<T>构造一个Type对象,这样的Nullable<T>对象的IsValueType将返回Type,并且对内存使用情况的分析将确认{{1}存储为值类型,但由于它违反了适用于所有其他值类型的一些规则,true最好被视为一种独特的实体。