我想知道是否有人知道C#编译器如何处理以下赋值:
int? myInt = null;
我的假设是执行了隐式转换,但我无法弄清楚如何处理空文字赋值.我解散了System.Nullable对象,发现隐式运算符覆盖了这个:
public static implicit operator T?(T value) { return new T?(value); }
一旦调用,这将尝试触发辅助构造函数:
public Nullable(T value) { this.value = value; this.hasValue = true; }
这就是我的困惑发挥作用的地方...... this.value属于某种值类型,不能为null.
那么,有没有人知道这种"魔法"是如何发生的......或者我认为假设辅助构造函数被调用是错误的?是否调用默认构造函数,因为编译器知道它不能将第二个构造函数的签名与null文本匹配(导致myInt被分配给新的"null"Nullable)?
该声明:
int? myInt = null;
获取编译为:
.locals init (valuetype [mscorlib]System.Nullable`1V_0) IL_0000: ldloca.s V_0 IL_0002: initobj valuetype [mscorlib]System.Nullable`1
其中,根据MSDN,意味着«在指定地址为空引用或适当的原语类型的0初始化值类型的每个字段.»
所以这里没有构造函数或转换.HasValue将返回false,并且尝试获取其Value将抛出InvalidOperationException.除非你当然使用GetValueOrDefault.