在为结构赋值时,CLR如何绕过抛出错误?

Tar*_*rik 5 c# struct nullable

我试图理解这段代码中的一件事:

Nullable<Int32> x = 5;
Nullable<Int32> y = null;
Console.WriteLine("x: HasValue={0}, Value={1}",  x.HasValue, x.Value);
Console.WriteLine("y: HasValue={0}, Value={1}",  y.HasValue, y.GetValueOrDefault());
Run Code Online (Sandbox Code Playgroud)

输出是:

x: HasValue=True, Value=5
y: HasValue=False, Value=0
Run Code Online (Sandbox Code Playgroud)

当你传递nully我时我不明白的东西,我相信它会调用,public static implicit operator Nullable<T>(T value)但是这个方法的定义初始化了一个新的struct传递value,null但是它被赋值,但是构造函数方法不检查它是否为null所以它可以分配default(T)value.

为什么我们甚至可以在这里为结构赋值null并且它工作正常?

你们这些我错过了什么吗?我不明白它是如何绕过null并返回默认值的.

可空代码内部定义:

http://codepaste.net/gtce6d

Ste*_*ven 6

相信它调用公共静态隐式运算符Nullable(T值)

不,它不需要,因为TInt32在这种情况下,而null不是一个Int32.它只y保留变量default,这意味着对于所有字节都是的结构0.这会产生一个HasValue返回的结构false.

您无法真正传递null给结构体,但C#编译器正在将此转换为默认的初始化.

  • 使它可为空的原因是你定义的是可空的<x>.Nullable struct具有一些编译器魔力,使其更易于使用. (2认同)