当前位置:  开发笔记 > 编程语言 > 正文

如何将null文字赋值给System.Nullable <T>类型由.Net(C#)处理?

如何解决《如何将null文字赋值给System.Nullable<T>类型由.Net(C#)处理?》经验,为你挑选了1个好方法。

我想知道是否有人知道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)?



1> Jb Evain..:

该声明:

int? myInt = null;

获取编译为:

  .locals init (valuetype [mscorlib]System.Nullable`1 V_0)
  IL_0000:  ldloca.s   V_0
  IL_0002:  initobj    valuetype [mscorlib]System.Nullable`1

其中,根据MSDN,意味着«在指定地址为空引用或适当的原语类型的0初始化值类型的每个字段.»

所以这里没有构造函数或转换.HasValue将返回false,并且尝试获取其Value将抛出InvalidOperationException.除非你当然使用GetValueOrDefault.

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有