为什么Nullable <T>被认为是结构而不是类?

Ala*_*ain 9 c# generics nullable type-constraints

我正在尝试定义一个泛型类,它接受任何可以设置为null的类型:

public abstract class BundledValue_Classes<T> 
    where T : class
{
    private Tuple<T, object> _bundle= new Tuple<T, object>();
    public T Value
    { 
        get { return _bundle == null ? null : _bundle.Item1; }
        set { _bundle = new Tuple<T, object>(value, obj); }
    }
    //...
Run Code Online (Sandbox Code Playgroud)

这很好用.我还想创建一个派生类,它可以采用任何原始类型(int,double等),并简单地将其解析为与上面的类相同,但原语包含在Nullable中

public abstract class BundledValue_Structs<T> 
    : BundledValue_Classes<T?> 
    where T : struct
{
   //...
}
Run Code Online (Sandbox Code Playgroud)

但由于某种原因,这不起作用.我收到错误:The type 'T?' must be a reference type in order to use it as parameter 'T' in the generic type or method 'BundledValue_Classes<T>'

我明白在这里要做什么?我不想复制粘贴整个BundledValue_Classes<T>类的内容只是为了处理包含在一个原语的情况Nullable<T>.

也许有一些方法可以设置类型约束,BundledValue_Classes<T>这样它就不仅可以接受类,还可以接受任何可以赋值为null的Nullable<T>类型(包括类型,这似乎是规则的唯一例外.)

Jon*_*eet 15

Nullable<T> 一个结构,根据文档.它根本不是一个阶级.它是一个值类型,在字段方面看起来有点像这样:

public struct Nullable<T>
{
    private readonly T value;
    private readonly bool hasValue;
}
Run Code Online (Sandbox Code Playgroud)

类型的nullNullable<T>不是空引用,它只是hasValue字段为false 的值.

但是请注意,Nullable<T>它不满足约束条件where TFoo : struct,因为它实际上是一个不可为空的值类型约束.基本上Nullable<T>不满足classstruct约束.有没有约束它确实只允许可空类型(参考或Nullable<T>).