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,对吧?显然,这与泛型有关。

我在这里错过了什么?语言规范中有关于这方面的内容吗?

谢谢。

Nullable is not a ValueType

您正在测试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>视为一种唯一的实体。