C#中三元运算符的意外行为

时间:2015-02-19 11:59:25

标签: c#

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”。

是什么解释了这种意想不到的行为?

2 个答案:

答案 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 的类型必须相同,或者从一种类型到另一种类型必须存在隐式转换。

由于charint之间存在显式转换(但只是明确反过来),以下调用的类型

boolean ? integer : character

int

当您使用字符串连接任何非字符串对象时,会在对象上调用ToString()


这意味着:

  "string" + integer
= "string" + integer.ToString()

  "string" + character
= "string" + character.ToString()

最后

  "string" + (boolean ? integer : character)
= "string" + integerResult
= "string" + integerResult.ToString()