为什么将空字符串连接起来是有效的,但调用“null.ToString()”却无效?

134

这是有效的C#代码

var bob = "abc" + null + null + null + "123";  // abc123

这不是有效的C#代码

var wtf = null.ToString(); // compiler error

为什么第一条语句是有效的?


103
我觉得你将 null.ToString() 命名为 wtf 很奇怪。为什么会让你感到惊讶?因为当你没有任何调用来源时,你无法调用实例方法。 - BoltClock
13
当然可以在空实例上调用实例方法。虽然在C#中不可能,但在CLR中是完全有效的 :) - leppie
1
关于String.Concat的答案几乎正确。实际上,问题中的特定示例是常量折叠之一,第一行中的null值被编译器消除-即它们在运行时不再存在-编译器已经擦除了它们。我在这里写了一个小独白,介绍了有关字符串连接和常量折叠的所有规则,以获取更多信息:https://dev59.com/sWox5IYBdhLWcg3wjE5i#9132374。 - Chris Shain
83
你可以给一个字符串添加内容,但你无法从空白创建一个字符串。 - raddrick
第二个语句无效吗?class null_extension { String ToString( Object this arg ) { return ToString(arg); } } - ctrl-alt-delor
11个回答

0
通常情况下,接受 null 作为参数是否有效取决于规范,但在 null 上调用方法始终是无效的。

这是关于编程的话题,为什么在字符串的情况下加号运算符的操作数可以为空。这有点像VB的东西(抱歉,各位),是为了让程序员的生活更轻松,或者假设程序员无法处理空值。我完全不同意这个规定。'unknown' + 'anything' 应该仍然是 'unknown'...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接