首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >一个字符串怎么是null + true?

一个字符串怎么是null + true?
EN

Stack Overflow用户
提问于 2010-12-18 01:01:30
回答 6查看 5.4K关注 0票数 112

既然true不是字符串类型,那么null + true如何成为字符串呢?

代码语言:javascript
复制
string s = true;  //Cannot implicitly convert type 'bool' to 'string'   
bool b = null + true; //Cannot implicitly convert type 'string' to 'bool'

这背后的原因是什么?

EN

回答 6

Stack Overflow用户

发布于 2010-12-18 01:10:40

原因是,一旦引入了+,C#操作符绑定规则就开始发挥作用。它将考虑可用的+运算符集,并选择最佳重载。其中一个运算符如下所示

代码语言:javascript
复制
string operator +(string x, object y)

此重载与expression null + true中的参数类型兼容。因此,它被选为运算符,并被计算为本质上为((string)null) + true的值,其值为"True"

C#语言规范的第7.7.4节包含了有关此解决方案的详细信息。

票数 44
EN

Stack Overflow用户

发布于 2010-12-18 01:13:05

编译器开始寻找可以首先接受空参数的operator+()。标准值类型都不符合条件,null不是它们的有效值。唯一匹配的是System.String.operator+(),没有歧义。

运算符的第二个参数也是一个字符串。这就是kapooey,不能隐式地将bool转换为string。

票数 11
EN

Stack Overflow用户

发布于 2010-12-18 01:14:55

有趣的是,使用Reflector检查生成的内容,代码如下:

代码语言:javascript
复制
string b = null + true;
Console.WriteLine(b);

被编译器转换成这样:

代码语言:javascript
复制
Console.WriteLine(true);

我必须说,这种“优化”背后的原因有点奇怪,与我期望的运算符选择并不一致。

另外,下面的代码:

代码语言:javascript
复制
var b = null + true; 
var sb = new StringBuilder(b);

被转换为

代码语言:javascript
复制
string b = true; 
StringBuilder sb = new StringBuilder(b);

其中string b = true;实际上不被编译器接受。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4472900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档