代码之家  ›  专栏  ›  技术社区  ›  Developer Webs

C#空整数?为ToString返回0

c#
  •  -3
  • Developer Webs  · 技术社区  · 7 年前

    这显然会导致一个错误:

    null.ToString();
    

    为什么这个ToString没有得到相同的错误:

    int? foo = null;
    foo.ToString(); // 0, why no error?
    0 == foo; // false
    null == foo; // true
    null == 0; // false
    

    我知道有一些内在的魔力,但对我来说,这似乎很奇怪。当值不等于int 0时,ToString()将返回0。

    1 回复  |  直到 7 年前
        1
  •  2
  •   ph3rin    7 年前

    下面是对代码的逐行分析。

    null.ToString();
    

    这里对空引用调用一个方法。当然会抛出异常。

    int? foo = null;
    

    这将创建一个结构 foo 类型 Nullable<int> 在堆栈上,并具有 HasValue 属性设置为false。

    foo.ToString();
    

    这就叫 ToString() 方法 Nullable<T> ,它被重写以返回空字符串( "" ). (在你的问题中,你说过 0 .事实并非如此。) 请注意,直接在 值类型 不会导致拳击。

    0 == foo
    

    这是有效的,返回false,因为 0 被转换成 Int32? 它包含一个值,但是 福 不包含任何值。看见 this answer about nullable type conversion 大约和 documentation about lifted operators

    null == foo;
    

    作品和回报 true 因为 null 转换为 Int32? 它不包含任何值。这等于 福 ,它也不包含任何值。

    null == 0
    

    作品和回报 false 因为 无效的 转换为 Int32? 和 0 转换为 Int32? 但前者没有价值。