C# 为什么向字符串添加null是合法的?

C# 为什么向字符串添加null是合法的?,c#,language-design,C#,Language Design,MSDN上的文章显示了这一点: string str = "hello"; string nullStr = null; string emptyStr = ""; string tempStr = str + nullStr; // tempStr = "hello" bool b = (emptyStr == nullStr);// b = false; string newStr = emptyStr + nullStr; // creates a new empty string in

MSDN上的文章显示了这一点:

string str = "hello";
string nullStr = null;
string emptyStr = "";

string tempStr = str + nullStr; // tempStr = "hello"
bool b = (emptyStr == nullStr);// b = false;
string newStr = emptyStr + nullStr; // creates a new empty string
int len = nullStr.Length; // throws NullReferenceException
为什么与null连接不会引发null引用异常?这是为了让程序员的生活更轻松,这样他们就不必在连接之前检查null了吗?

来自:

在字符串串联操作中, C#编译器处理空字符串 与空字符串相同,但是 不转换 原始空字符串

有关以下各项的更多信息:

二进制+运算符执行字符串 当一个或两个 操作数的类型为字符串

如果 字符串串联的操作数为 null,将替换空字符串。 否则,将禁用任何非字符串参数 转换为其字符串表示形式 通过调用虚拟ToString 方法继承自类型对象

如果 ToString返回null,一个空字符串 被替换


它不抛出null引用异常的原因是,您实际上没有尝试访问null对象上的任何属性或方法。作为CMS引号,连接字符串时,空字符串将替换为空字符串

我猜语言(或标准库)设计师认为这是一个足够普遍的情况,他们会帮程序员一个忙


(很好!我总是假设通过异常使用null进行concating!)

从概念上讲,字符串通常被认为是值,而不是对具有标识的对象的引用。它们不是具有值语义的
struct
s的主要原因之一是赋值时复制带来的开销。如果字符串值,则它们不能为null,因此“+”操作符将
null
视为空字符串(即,就好像
default(string)==”
default(int)==0一样)

我同意从概念上讲字符串只是值。但是,请考虑下面的代码:

int? i = null;
i += 1; // The result of this is that i == null
如果其他值类型运算符使用default()作为字符串运算符将null转换为“”的方式,那么您的解释就有意义了


最简单的说法是,为了方便起见,字符串运算符是一种快捷方式(特例)。

问题最终是关于语言设计的基本原理。有些人试图对其他答案进行猜测。我们需要微软的人来回答这个问题。C#团队的最佳选择,因为它与C#6空条件运算符一起工作,特别是当与C#6字符串插值功能相结合时:例如,
return$“{person?.FirstName}{person?.LastName}”
这就是它的功能,而不是它为什么这样做。