【问题标题】:Why isn't null an instance of a Nullable<> type?为什么 null 不是 Nullable<> 类型的实例?
【发布时间】:2017-07-10 11:50:36
【问题描述】:

在编写涉及手动类型检查的测试时,我发现null 不会评估为Nullable&lt;&gt; 类型的实例,例如对于Nullable&lt;int&gt; 类型(与int? 相同),下面的说法是错误的

null is int?

null 分配给int? 时有效。为什么会这样?

【问题讨论】:

  • 由于隐式转换,您可以将 null 分配给可为 null 的 int。但它们不是同一类型。
  • 添加@NtFreX 评论:is 检查类型,== 检查相等性。这句话正确的:int? x; if(x == null)
  • 也许您可以向我们解释您要解决的潜在问题,我们可以协助解决这个问题@PBozo?
  • 整数?可以为空。 int 对空值无效。

标签: c# .net types


【解决方案1】:

那么,为什么 nullables 应该是特殊的?这不代表任何引用类型,句号:

var isObject = null is object;

会给你一个编译时错误:

错误 CS0184:给定的表达式永远不是提供的 ('object') 类型

Nullable&lt;T&gt; 在这里是一个红鲱鱼。

null 的类型是 null 类型,它可以分配给任何引用类型或可为 null 的类型,因为存在隐式转换(第 2.4.4.6 节)。

根据规范,这个 is 运算符的工作方式如下(第 7.10.10 节):

is 运算符用于动态检查对象的运行时类型是否与给定类型兼容。操作 E 的结果是 T,其中 E 是表达式,T 是类型,是一个布尔值,指示 E 是否可以通过引用转换、装箱转换或拆箱转换成功地转换为 T 类型。在将类型实参替换为所有类型参数之后,该操作的评估如下:

  1. 如果 E 是匿名函数,则会发生编译时错误
  2. 如果 E 是方法组或空字面量,或者如果 E 的类型是引用类型或可空类型并且 E 的值为空,结果是假的。 (...)

粗体部分用于说明。

阅读thisthis answer 了解更多信息。

【讨论】:

    【解决方案2】:

    可能令人困惑的是null 可以是一个值和一个类型。

    如果您比较或分配null,则使用以下隐式转换首先将值转换为Nullable

    public static implicit operator Nullable<T> (
        T value
    )
    

    如果您使用is 不是一个值,而是进行类型比较。因为null 的类型是null 而不是Nullable&lt;T&gt;,所以它们不相等。

    【讨论】:

      【解决方案3】:

      排序中:-通过使任何值类型可为空,null 不会被转换为该类型或 null 不是该类型。如果变量分配为 null,则为可为 null,HasValue 属性of sturct 变为 false ,然后装箱将返回 null 的引用,但这并不意味着它是那个特定的值类型。

      您需要研究

      的实施和工作
      Nullable<T>
      

      基本属性 Nullable 结构的两个基本成员是 HasValue 和 Value 属性。如果 Nullable 对象的 HasValue 属性为 true,则可以使用 Value 属性访问该对象的值。如果 HasValue 属性为 false,则对象的值未定义,访问 Value 属性的尝试会引发 InvalidOperationException。

      装箱和拆箱 当可空类型被装箱时,公共语言运行时会自动装箱 Nullable 对象的基础值,而不是 Nullable 对象本身。也就是说,如果 HasValue 属性为 true,则 Value 属性的内容被装箱。当可空类型的基础值被拆箱时,公共语言运行库会创建一个初始化为基础值的新 Nullable 结构。 如果可空类型的 HasValue 属性为 false,则装箱操作的结果为空。因此,如果将装箱的可为空类型传递给需要对象参数的方法,则该方法必须准备好处理参数为空的情况。当将 null 拆箱为可空类型时,公共语言运行时会创建一个新的 Nullable 结构并将其 HasValue 属性初始化为 false。

      我刚刚从 Microsoft 文档中复制了这一行,它会让您对孔的概念有所了解 阅读整个文档链接如下

      https://docs.microsoft.com/en-us/dotnet/api/system.nullable-1?view=netframework-4.7

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多