在 C# 3.0 中,您可以将 null 分配给 int 吗?类型(在 CLR 中是 int?是一个结构):
int? a = null;
但是当你定义一个自定义结构时:
struct MyStruct
{
}
编译这段代码时出现错误:
MyStruct a = null;
错误如下:
Cannot convert null to 'Example.MyStruct' because it is a non-nullable value type
而 int?是 CLR 中的一个结构,我们可以将 null 分配给它在某种程度上是违反直觉的。 我想 null 是隐式转换或装箱到 certian int 吗?表示空值的值。它是如何精确完成的?我怎样才能以可以执行以下行的方式扩展 MyStruct:
MyStruct a = null;
最佳答案
是因为int?
实际上是简写Nullable<int>
.您也可以为您的类型做同样的事情:
MyStruct? a = null;
null
只能隐式转换为 nullable 类型,这意味着任何引用类型或任何可为 null 的值类型 - 其中后者表示 Nullable<T>
对于一些 T
.
请注意,这种从 null
转换的能力确实是一种语言特性——编译器正在转换它:
int? a = null;
进入
int? a = new int?();
它们的意思相同——基本上,可空值类型的“空”值是一个值,其中 HasValue
为 false,默认情况下为 false。它与 null reference 不同 - 尽管装箱这样的 null 值将导致 null 引用。
(这是一个跨越语言、库和 CLR 边界的特性的例子。库部分非常简单,CLR 部分只与装箱和拆箱有关——但在提升运算符等方面有很多在语言中。)
关于用 null 初始化的 C# 值类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4270119/