这显然会导致错误:
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似乎很奇怪。
答案 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 conversion和documentation about lifted operators
Int32?
工作并返回foo
,因为null == foo;
转换为不包含任何值的true
。等于null
,也不包含任何值。
Int32?
工作并返回foo
,因为null == 0
转换为false
,而null
转换为Int32?
,但前者不包含值。