Nullable is not a ValueType
本文关键字:ValueType not is Nullable | 更新日期: 2023-09-27 18:02:33
如果您查看.NET Nullable的文档,您会看到:
struct Nullable<T>
请注意,它是一个结构,而不是一个类。
struct Nullable<T>
似乎是而不是ValueType,这是非常出乎意料的。以下代码打印错误:
Type nullableType = typeof(Nullable<int>);
Console.WriteLine(nullableType is ValueType);
如果查看生成的IL,您会发现编译器在编译时将nullableType
确定为ValueType。但是,如果它是一个结构,它怎么可能是ValueType呢?所有结构都是ValueTypes,对吧?显然,这与泛型有关。
我在这里错过了什么?语言规范中有关于这方面的内容吗?
谢谢。
您正在测试System.Type
是否为值类型。事实并非如此。重写如下:
Nullable<int> test = 42;
Console.WriteLine(test is ValueType);
这是一种值类型,可以这样尝试:
Type nullableType = typeof(Nullable<int>);
Console.WriteLine(nullableType.IsValueType);
这应该是真的。希望能有所帮助。
Nullable<T>
是一个泛型类型族,既不遵守值类型的规则,也不遵守类类型的规则。用于检查对象类型的运行时方法需要装箱。如果Nullable<T>
的HasValue
属性是true
,则尝试将其装箱将其分解为T
并装箱。否则,尝试对其进行装箱将产生null
。在任何情况下,它都不会被装箱为Nullable<T>
。可以为Nullable<T>
构造一个Type对象,这样的Type
对象的IsValueType
将返回true
,并且对内存使用情况的分析将确认Nullable<T>
被存储为值类型,但由于它违反了适用于所有其他值类型的一些规则,因此最好将`Nullable<T>
视为一种唯一的实体。