字符串和整数,隐性和显性
题
有同事问我这个,在我脑子昏昏沉沉的状态,我没有一个答案:
为什么你可以这样做:
string ham = "ham " + 4;
但是,并非:
string ham = 4;
如果有字符串转换隐式转换/操作,当你的串接的,为什么不一样时的分配的它作为一个字符串? (无需做当然一些运算符重载,)
解决方案
当级联编译器开启的发言"ham" + 4
成呼叫String.Concat
,它有两个object
参数,因此该值4
是盒装然后ToString
被称为上。
有关的分配有从int
没有隐式转换到string
,并且因此可以不明确地进行转换其分配4
到string
。
在换句话说两个分配是由编译器,处理的非常不同的,尽管事实上,他们看起来在C#非常相似。
其他提示
做级联时,没有隐式转换。字符串连接解析下降到String.Concat呼叫,其中有一个过载这需要对象。正是这种过载,其执行一个(明确)转换为字符串。
所述第一表达的右手侧的值是一个字符串,而第二个表达式的右手侧的值则不是。该concatonation被提供在第一个场景,这里的分配没有做什么特别的魔力。在第二种情形中,分配继续发挥哑。
在表达
"ham " + 4
力的4至基于字符串类型和加法运算符的组合的字符串的隐式转换。具体来说它的“+”操作符的质量,做运算符重载时,你可以手动执行同一类型的东西。
一个类似且不太明显的例子是:
长为mynumber = Int64.MaxValue - 1;
在这种情况下,“1”应该被评估为32位整数,但它是隐式转换。您可以检查C#语言规范第6.1编译器支持隐式转换的一个详尽的清单。
编辑:要清楚,语言规范区间i称为编译器支持列表隐式转换,而运营商如“+”可以有自己支持的转换
不隶属于 StackOverflow