static void test(bool b)
{
int i = 1; char c = (char)65;
string s; if (b) s = "blubb" + i; else s = "blubb" + c;
string t = "blubb" + (b ? i : c);
Console.WriteLine(s + " == " + t);
}
通话测试(true)给出“blubb1 == blubb1”。
通话测试(假)给出“blubbA == blubb65”。
其他问题
编辑:
static void test(bool b)
{
int i = 1; char c = (char)65;
string s; if (b) s = "blubb" + i; else s = "blubb" + c;
string t = "blubb" + (b ? i : c);
string u = "blubb" + (b ? c : i);
Console.WriteLine(s + " == " + t + " == " + u);
}
通话测试(true)给出“blubb1 == blubb1 == blubb65”。
通话测试(假)给出“blubbA == blubb65 == blubb1”。
是什么解释了这种意想不到的行为?
答案 0 :(得分:2)
这是关键线
string t = "blubb" + (b ? i : c);
由于i
类型为int
,它会将c
投射到int
。
string s; if (b) s = "blubb" + i; else s = "blubb" + c;
之前的行可以用更易读的方式重写。
string s;
if(b)
{
s = "blubb" + i; // i is an int here
// So s = "blubb" + 1;
}
else
{
s = "blubb" + c; // c is a char here. The char 'A'.
// So s = "blubb" + 'A';
}
两个回答你问题的第二部分。当您希望看到(b ? c : i)
时,int
会解析为char
。
这是因为将char
转换为int
是隐式转换
将int
转换为char
是明确转换的位置。
在三元运算符中使用隐式转换。
答案 1 :(得分:2)
来自MSDN:
condition ? first_expression : second_expression
...
first_expression 和 second_expression 的类型必须相同,或者从一种类型到另一种类型必须存在隐式转换。
由于char
和int
之间存在显式转换(但只是明确反过来),以下调用的类型
boolean ? integer : character
是int
。
当您使用字符串连接任何非字符串对象时,会在对象上调用ToString()
。
这意味着:
"string" + integer
= "string" + integer.ToString()
和
"string" + character
= "string" + character.ToString()
最后
"string" + (boolean ? integer : character)
= "string" + integerResult
= "string" + integerResult.ToString()