如果您查看.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,对吗?显然,它与泛型有关。
我在这里缺少什么?语言规范中是否有关于此的内容?
感谢。
答案 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
最好被视为一种独特的实体。