C# 为什么ToString()的这种隐式使用不会导致异常?
我已经创建了一个简单的例子来问这个问题 编译并运行以下代码:C# 为什么ToString()的这种隐式使用不会导致异常?,c#,.net,C#,.net,我已经创建了一个简单的例子来问这个问题 编译并运行以下代码: static void Main(string[] args) { string bigString, littleString; littleString = null; bigString = "word " + littleString + " word"; } 此代码进行编译,但引发运行时NullReference异常 static void Main(string[] args) { str
static void Main(string[] args)
{
string bigString, littleString;
littleString = null;
bigString = "word " + littleString + " word";
}
此代码进行编译,但引发运行时NullReference异常
static void Main(string[] args)
{
string bigString, littleString;
littleString = null;
bigString = "word " + littleString.ToString() + " word";
}
为什么第一个代码没有抛出类似的异常?我原以为,为了将它连接到其他字符串,会隐式使用ToString(),在这一点上,它会遇到与第二段代码相同的基本问题。第一段代码根本不调用
ToString
。它调用string.Concat(string,string)
,该函数在其实现中处理null
值,就好像它们是空字符串一样。它不需要调用ToString
来将该参数转换为字符串
(无论它是否为null
),因为它已经是字符串
。(如果它不是字符串
,则需要对其调用ToString
,但只有在它不是null
)时才会这样做。在字符串串联操作中,C编译器将空字符串视为空字符串,但不会转换原始空字符串的值
这就是
String.Concat的工作原理。运算符+
(用于字符串值)使用string.Concat
,它将null
字符串替换为空字符串。因此,对于空值,在字符串串联中没有对ToString
的隐式调用
在第二个代码段中,您显式地对空值调用了ToString
,因此出现了异常
在字符串连接操作中,C#编译器处理空值
字符串与空字符串相同,但不转换值
原始空字符串的
当一个或两个运算符同时存在时,二进制+运算符将执行字符串连接
操作数的类型为字符串
如果字符串串联的操作数为空,则替换空字符串。否则,任何非字符串参数都将转换为空字符串
通过调用virtualtoString方法来表示字符串
从类型对象继承
因为使用了内部处理这种情况:“String.Empty用于代替任何空参数”为什么您认为第一个示例涉及ToString
?