既然true
不是字符串类型,那么null + true
如何成为字符串呢?
string s = true; //Cannot implicitly convert type 'bool' to 'string'
bool b = null + true; //Cannot implicitly convert type 'string' to 'bool'
这背后的原因是什么?
发布于 2010-12-18 01:10:40
原因是,一旦引入了+
,C#操作符绑定规则就开始发挥作用。它将考虑可用的+
运算符集,并选择最佳重载。其中一个运算符如下所示
string operator +(string x, object y)
此重载与expression null + true
中的参数类型兼容。因此,它被选为运算符,并被计算为本质上为((string)null) + true
的值,其值为"True"
。
C#语言规范的第7.7.4节包含了有关此解决方案的详细信息。
发布于 2010-12-18 01:13:05
编译器开始寻找可以首先接受空参数的operator+()。标准值类型都不符合条件,null不是它们的有效值。唯一匹配的是System.String.operator+(),没有歧义。
运算符的第二个参数也是一个字符串。这就是kapooey,不能隐式地将bool转换为string。
发布于 2010-12-18 01:14:55
有趣的是,使用Reflector检查生成的内容,代码如下:
string b = null + true;
Console.WriteLine(b);
被编译器转换成这样:
Console.WriteLine(true);
我必须说,这种“优化”背后的原因有点奇怪,与我期望的运算符选择并不一致。
另外,下面的代码:
var b = null + true;
var sb = new StringBuilder(b);
被转换为
string b = true;
StringBuilder sb = new StringBuilder(b);
其中string b = true;
实际上不被编译器接受。
https://stackoverflow.com/questions/4472900
复制相似问题