为什么Nullable <T>不匹配作为泛型约束的引用类型

Ear*_*rlz 18 c# generics nullable reference-type generic-constraints

可能重复:可以为
Nullable类型作为通用参数?

我遇到了泛型类型约束非常奇怪的事情.我有一个这样的课:

public SomeClass<T> where T:class
{
}
Run Code Online (Sandbox Code Playgroud)

但是,我发现我不能像我期望的那样使用可空类型:

new SomeClass<int?>();
Run Code Online (Sandbox Code Playgroud)

我得到一个int?必须是引用类型的错误.Nullable真的只是一个带有语法糖的结构,使它看起来像一个引用类型吗?

Mik*_*ray 21

Nullable<T>是一个struct(参见MSDN),但它是唯一struct不满足struct约束的.因此,在使用或约束Nullable时,不能将a 用作泛型类型参数.classstruct

Nullable<T>不仅仅是一个含有一些合成糖的结构.它在CLR中有一些特殊的支持.例如,它有特殊的拳击行为.具体来说,可以为空的盒子.标的值是盒装的.如果nullable为空值(HasValue为false),则将其转换为空引用.此外,任何Nullable<T>to的转换运算符都会Nullable<U>从转换中T转移到U.这些是您无法在.NET 1.0/1.1中实现的功能.