C# Nullable不是ValueType

C# Nullable不是ValueType,c#,nullable,C#,Nullable,如果查看.NET Nullable的文档,您将看到: struct Nullable<T> struct Nullable 请注意,它是一个结构,而不是一个类 似乎struct Nullable不是值类型,这是非常意外的。以下代码打印为False: Type nullableType = typeof(Nullable<int>); Console.WriteLine(nullableType is ValueType); Type nullabl

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

   struct Nullable<T>
struct Nullable
请注意,它是一个结构,而不是一个类

似乎
struct Nullable
不是值类型,这是非常意外的。以下代码打印为False:

   Type nullableType = typeof(Nullable<int>);
   Console.WriteLine(nullableType is ValueType);
Type nullableType=typeof(Nullable);
Console.WriteLine(nullableType为ValueType);
如果查看生成的IL,您将看到编译器在编译时将
nullableType
确定为ValueType。但是如果它是一个结构,它怎么可能是一个ValueType呢?所有结构都是ValueType,对吗?显然,它与泛型有关

我错过了什么?语言规范中对此有什么规定吗


谢谢。

您正在测试
System.Type
是否为值类型。事实并非如此。改写如下:

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

这是一种值类型,请尝试以下方法:

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

这应该是真的。希望对您有所帮助。

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

看到两个答案很有趣,一个声称它不是值类型,另一个声称它是值类型,两个答案的投票数几乎相同。很明显,你问了一个没有明确答案的问题。我想说,Nullable既不是结构也不是类,而是C#编译器提供的hack。你应该更仔细地阅读答案。他们都说Nullable实际上是一种值类型,@Tom无意中检查了type是否是值type@Tom每个人都会偶尔发生一次。=]无论如何,因为他们似乎已经回答了您的问题,您应该通过单击投票号码下的复选标记来接受其中一个答案。如果您尝试输出“test”类型,您会发现当HasValue为true时,它会被装箱为Int32,当HasValue为false时,它会被装箱为null。在这两种情况下,都不能将其装箱为可空。Int32是一个值类型,但这并不意味着可以为Null。Nullable有一个通用约束,其中t:struct。因此,它始终遵守System.ValueType的规则。当使用从System.Object重写的方法时,装箱和取消装箱就会出现。@Dinesh:Type
Nullable
存储为值类型,但正如所指出的,它有足够多的奇怪行为,因此被视为一种独特的实体。装箱不仅在调用
ToString
GetHashCode
Equals
时是必要的,因为
Nullable
t
没有提供自己的实现,而且在将
Nullable
强制转换为引用类型时也是必要的。嗯……我认为您是正确的,这很有意义……感谢您的澄清