有同事问我这个,在我脑子昏昏沉沉的状态,我没有一个答案:

为什么你可以这样做:

string ham = "ham " + 4;

但是,并非:

string ham = 4;

如果有字符串转换隐式转换/操作,当你的串接的,为什么不一样时的分配的它作为一个字符串? (无需做当然一些运算符重载,)

有帮助吗?

解决方案

当级联编译器开启的发言"ham" + 4成呼叫String.Concat,它有两个object参数,因此该值4是盒装然后ToString被称为上。

有关的分配有从int没有隐式转换到string,并且因此可以不明确地进行转换其分配4string

在换句话说两个分配是由编译器,处理的非常不同的,尽管事实上,他们看起来在C#非常相似。

其他提示

  

二元+运营商预定义的   数字和字符串类型。对于数字   类型,+计算其两者的总和   操作数。当一个或两个操作数   是字符串类型,+串接的   的字符串表示   操作数。

参考

  

赋值运算符(=)存储   在其右侧操作数的值   存储位置,属性或索引   其左侧操作数表示,并   返回值作为其结果。该   操作数必须是同一类型的(或   右侧的操作数必须是   隐式转换的类型   左手操作数)。

参考

做级联时,没有隐式转换。字符串连接解析下降到String.Concat呼叫,其中有一个过载这需要对象。正是这种过载,其执行一个(明确)转换为字符串。

所述第一表达的右手侧的值是一个字符串,而第二个表达式的右手侧的值则不是。该concatonation被提供在第一个场景,这里的分配没有做什么特别的魔力。在第二种情形中,分配继续发挥哑。

在表达

"ham " + 4 

力的4至基于字符串类型和加法运算符的组合的字符串的隐式转换。具体来说它的“+”操作符的质量,做运算符重载时,你可以手动执行同一类型的东西。

一个类似且不太明显的例子是:

长为mynumber = Int64.MaxValue - 1;

在这种情况下,“1”应该被评估为32位整数,但它是隐式转换。您可以检查C#语言规范第6.1编译器支持隐式转换的一个详尽的清单。

编辑:要清楚,语言规范区间i称为编译器支持列表隐式转换,而运营商如“+”可以有自己支持的转换

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top