代码之家  ›  专栏  ›  技术社区  ›  Oliver Hanappi

比较可以为空的

  •  4
  • Oliver Hanappi  · 技术社区  · 15 年前

    基本上, Nullable<T> 是一个结构,它解释了诸如调用 .HasValue 永远不会扔 NullReferenceException . 我想知道为什么——给定一个没有值的空值——将 null 总是 true ,即使使用 Object.ReferenceEquals 因为它是一个结构,所以我认为它会返回false。

    clr中是否有特殊的行为来实现这一点?它还可能解释为什么泛型结构约束不允许空值。

    最好的问候,
    奥利弗哈纳皮

    3 回复  |  直到 15 年前
        1
  •  19
  •   Jon Skeet    15 年前

    如果你这样做:

    int? x = null;
    if (x == null)
    

    将使用 HasValue .

    使用 Object.ReferenceEquals 将首先对值进行装箱,然后将空值转换为空引用(这确实是特殊的CLR行为)。当一个可以为空的值类型被装箱时,结果要么是一个空引用,要么是一个 潜在的 值类型。换句话说,不存在可为空值类型的装箱值。

        2
  •  5
  •   LBushkin    15 年前

    可为空的比较并不总是返回true。 举个例子:

    int? n = null;
    int? m = 5;
    
    Console.WriteLine(n == null);  // prints True
    Console.WriteLine(m == null);  // prints False
    

    clr具有特殊的装箱行为 Nullable s,这样引用比较就可以如您所期望的那样工作。基本上, Value 结构的属性被装箱到 object .

        3
  •  2
  •   Igor Zevaka    15 年前

    对, Nullable<T> 是一个特殊的结构,享受编译器支持。我在博客上写了当它被编译成IL时会发生什么。 here .