我遇到了一个非常奇怪的事情,通用类型约束。我有一个这样的课:
public SomeClass<T> where T:class
{
}
但是,我发现我不能像我期望的那样使用可空类型:
new SomeClass<int?>();
我收到int?
必须是引用类型的错误。 Nullable真的只是一个带有语法糖的结构,使它看起来像一个引用类型吗?
答案 0 :(得分:21)
Nullable<T>
是struct
(请参阅MSDN),但它是唯一不满足struct
约束的struct
。因此,当使用Nullable
或class
约束时,您无法使用struct
作为泛型类型参数。
Nullable<T>
不仅仅是一个带有一些合成糖的结构。它在CLR中有一些特殊的支持。例如,它有特殊的拳击行为。具体来说,可以为空的盒子。标的值是盒装的。如果nullable为空值(HasValue为false),则将其转换为空引用。此外,任何Nullable<T>
到Nullable<U>
的转换运算符都会从T
转换为U
。这些是您无法在.NET 1.0 / 1.1中实现的功能。