为什么我可以为类型为"struct Nullable <T>"的值赋值null,而不是我的struct?

Ben*_*ual 4 c# struct nullable

我知道Nullable Value Types的机制.但是,我对以下内容感兴趣:

该空值类型与结构的工作(从https://referencesource.microsoft.com/#mscorlib/system/nullable.cs,ffebe438fd9cbf0e)

public struct Nullable<T> where T : struct {
    public Nullable(T value) {
        /* ... */
    }

    public bool HasValue {get;}

    public T Value {get;}
}
Run Code Online (Sandbox Code Playgroud)

我可以用这个

Nullable<int> i = null;
Run Code Online (Sandbox Code Playgroud)

现在,我以同样的方式创建自己的Nullable-Struct:

public struct MyNullable<T> where T : struct {
    public MyNullable(T value) {
        /* ... */
    }

    public bool HasValue {get;}

    public T Value {get;}
}
Run Code Online (Sandbox Code Playgroud)

为什么我不能这样做

MyNullable<int> i = null;
Run Code Online (Sandbox Code Playgroud)

现在?

我知道,struct的值不能为null - 但为什么struct Nullable的值可以为null?允许这种机制在哪里?

Mar*_*ell 7

允许这种机制在哪里?

在C#编译器本身.Nullable<T>是一种具有许多额外规则的特殊类型,包括如何null处理(比较和赋值)以及如何处理运算符(请参阅:"提升运算符").

目前支持在运行时进行Nullable<T>,特别"拳击"的规则.

您无法Nullable<T>在自己的代码中模拟,因为您无法表达这些特殊规则.