C#是否为null int?为ToString返回0

时间:2019-07-13 05:39:07

标签: c#

这显然会导致错误:

null.ToString();

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

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

我了解到发生了一些内部魔术,但是对我来说,当值不等于int 0时foo.ToString()返回0似乎很奇怪。

1 个答案:

答案 0 :(得分:1)

这是您的代码的行到行分析。

null.ToString();

在此处,对空引用调用方法。当然会抛出异常。

int? foo = null;

这会在堆栈上创建类型为foo的结构Nullable<int>,并且其HasValue属性为false。

foo.ToString();

这将调用ToString()的{​​{1}}方法,该方法将被覆盖以返回空字符串(Nullable<T>)。(在您提出的问题中,您说返回了{{1} }。这不是真的。)请注意,直接在值类型上调用覆盖的方法不会导致装箱。

""

这有效并且返回false,因为0转换为包含值的0 == foo ,但是0不包含任何值。有关this answer about nullable type conversiondocumentation about lifted operators

的信息,
Int32?

工作并返回foo,因为null == foo; 转换为不包含任何值的true。等于null,也不包含任何值。

Int32?

工作并返回foo,因为null == 0 转换为false,而null转换为Int32?,但前者不包含值。