为什么我不能创建自己的Nullable <T>模拟?

Rom*_*iuk 4 .net c#

我从https://referencesource.microsoft.com/获取了Nullable <T>类的源代码并将其放到文件中并重命名为NullableZZ(以及NonVersionableAttribute的源代码到单独的文件中).当我试图构建下一个代码时:

static void Main(string[] args)
{
    NullableZZ<int> n1 = 100;
    NullableZZ<int> n2 = null;
}
Run Code Online (Sandbox Code Playgroud)

我有这个错误:

错误CS0037无法将null转换为'NullableZZ',因为它是一个不可为空的值类型ConsoleApp2 C:\ Users\Roman2\source\repos\ConsoleApp2\ConsoleApp2\Program.cs

为什么C#编译器不想编译它?是否有一些"技巧"来编译其"自有"版本的Nullable <T>?

Jon*_*eet 15

为什么C#编译器不想编译它?

因为它对你的班级没有任何具体的知识,但它确实具有特定的知识Nullable<T>.

是否有一些"技巧"来编译其"自己的"版本Nullable<T>?

是.的null文字是转换为Nullable<T>任何非空值类型T,并且还任何引用类型.它不可转换为NullableZZ<int>.此外,int?有效的简写Nullable<int>- 它有特殊的待遇.

基本上查看规范(例如ECMA C#5规范)并观察它所谈论的所有地方Nullable<T>.你会发现很多提到的地方.

Nullable值类型在框架,语言和CLR中都有支持:

  • 该Nullable<T>类型必须存在于框架中
  • 该答案中描述了该语言的支持
  • CLR在验证泛型约束和装箱方面都有支持(其中可空值类型的空值框为空引用)