c# - 为什么我不能创建自己的 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# 编译器不想编译它?
因为它没有你的类的任何特定知识,但它确实具有Nullable<T>
.
编译它的“自己的”版本有一些“技巧”
Nullable<T>
吗?
是的。文字可null
转换Nullable<T>
为任何非可空值类型T
,也可转换为任何引用类型。它不能转换为NullableZZ<int>
. 此外,int?
它是有效的简写Nullable<int>
- 它有特殊处理。
基本上浏览规范(例如ECMA C# 5 规范)并观察它所谈论的任何地方Nullable<T>
。你会发现很多地方都提到了。
可空值类型在框架、语言和 CLR 中都有支持:
- 该
Nullable<T>
类型必须存在于框架中 - 该语言具有此答案中所述的支持
- CLR 在验证泛型约束和装箱方面提供支持(其中可空值类型的空值框到空引用)
推荐阅读
- excel - 尝试过滤单个列而不干扰其余列
- javascript - 反应:禁用右键单击videojs
- python - 在 Python 中使用 Pandas 确定奇偶值
- javascript - 不知道如何在本机反应中配置此文本颜色更改
- c# - 如何从音频文件路径获取 MediaFile 对象?
- c# - 如何在 C# 中创建 Linq AND 表达式?
- python - 如何忽略 --user 安装的库?
- java - Java 堆转储文件 (.hprof) 远大于 Eclipse MAT 中的堆大小
- node.js - Visual Studio for Mac 退出,而使用返回代码 127 构建 React-Template 导致找不到节点
- label - 如何在我的 sld 代码中连接两个标签(一个字符串和一个双精度类型)?