为什么我不能创建自己的Nullable <t>类似物?

时间:2018-10-12 17:06:30

标签: c# .net

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

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

我遇到了这个错误:

  

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

为什么C#编译器不想编译它?编译Nullable 的“自己的”版本是否有些“技巧”?

1 个答案:

答案 0 :(得分:14)

  

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

因为它没有您班级的任何特定知识,但是 Nullable<T>的特定知识。

  

编译Nullable<T>的“自己的”版本是否有一些“技巧”?

是的。对于任何非空值类型nullNullable<T>文字都可以转换为T,还可以转换为任何引用类型。它不能转换为NullableZZ<int>。另外,int?实际上是Nullable<int>的简写-它具有特殊的处理方式。

基本上浏览一下规范(例如ECMA C# 5 spec),并在所有涉及Nullable<T>的地方进行观察。您会在提到的地方找到很多

可空值类型在框架,语言和CLR中具有支持:

  • Nullable<T>类型必须存在于框架中
  • 该语言具有此答案中所述的支持
  • CLR在验证通用约束和装箱(其中可为空值的类型为null的框将其引用为空引用)方面提供支持