Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么ToString()的这种隐式使用不会导致异常?_C#_.net - Fatal编程技术网

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