C#值类型初始化为null

mga*_*mer 7 .net c# null nullable value-type

在C#3.0中,您可以为int分配null吗?type(在CLR int?中是一个struct):

int? a = null;
Run Code Online (Sandbox Code Playgroud)

但是当你定义一个自定义结构时:

struct MyStruct
{

}
Run Code Online (Sandbox Code Playgroud)

编译此代码时出错:

MyStruct a = null;
Run Code Online (Sandbox Code Playgroud)

错误如下:

Cannot convert null to 'Example.MyStruct' because it is a non-nullable value type
Run Code Online (Sandbox Code Playgroud)

int?是CLR中的结构,它在某种程度上违反直觉,我们可以为它分配null.我想null被隐式地转换或装箱到certian int?表示空值的值.它是如何完成的?如何以可以执行该行的方式扩展MyStruct:

MyStruct a = null;
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 20

这是因为int?实际上是速记Nullable<int>.你也可以为你的类型做同样的事情:

MyStruct? a = null;
Run Code Online (Sandbox Code Playgroud)

null只能隐式转换为可空类型,这意味着任何引用类型或任何可以为null的值类型 - 后者Nullable<T>对某些类型意味着T.

请注意,这种转换能力null实际上是一种语言特性 - 编译器正在转换它:

int? a = null;
Run Code Online (Sandbox Code Playgroud)

int? a = new int?();
Run Code Online (Sandbox Code Playgroud)

它们的含义相同 - 基本上,可空值类型的"null"值是一个HasValuefalse,默认情况下为false.它与空引用不同 - 虽然像这样装箱空值导致空引用.

(这是跨越语言,库和CLR边界的功能的一个示例.库部分非常简单,CLR部分仅与装箱和拆箱有关 - 但在语言中提升操作员等方面有很多.)