Nullable初始化为null - 理解源代码

Mug*_*gen 3 c# null nullable

我正在查看.NET Nullable<T>类的以下代码:http: //referencesource.microsoft.com/#mscorlib/system/nullable.cs,ffebe438fd9cbf0e

我想知道,以下用途的行为是什么:

int? x = null;

显然,x.hasValue()返回false,但是我看到在构造函数中,hasValue属性总是设置为true.

那我错过了什么?

ang*_*son 6

"构造函数",是的,显式编写的构造函数Nullable<T>,但是所有结构都有一个额外的构造函数,一个不允许实现的无参数默认构造函数.这将始终存在.

因此,您可以将问题中的代码视为与此类似:

int? x = new Nullable<int>();
Run Code Online (Sandbox Code Playgroud)

实际上,如果我们编译你的代码和我的代码并查看生成的IL:

你的代码:

IL_0001:  ldloca.s    00 // a
IL_0003:  initobj     System.Nullable<System.Int32>
Run Code Online (Sandbox Code Playgroud)

我的代码:

IL_0001:  ldloca.s    00 // a
IL_0003:  initobj     System.Nullable<System.Int32>
Run Code Online (Sandbox Code Playgroud)

所以他们完全相同.

结构的默认构造函数将所有字段初始化为逐字节零,对于bool字段等于false,对于数字字段等于0,null对于引用类型字段等等.