首页 > 解决方案 > 为什么我不能创建自己的 Nullable 类似物?

问题描述

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

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

我有这个错误:

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

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

标签: c#.net

解决方案


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

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

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

是的。文字可null转换Nullable<T>为任何非可空值类型T,也可转换为任何引用类型。它不能转换为NullableZZ<int>. 此外,int?它是有效的简写Nullable<int>- 它有特殊处理。

基本上浏览规范(例如ECMA C# 5 规范)并观察它所谈论的任何地方Nullable<T>。你会发现很多地方都提到了。

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

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

推荐阅读