2015-02-19 3 views
2
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».Неожиданное поведение тернарного оператора в C#

Тест вызова (false) дает «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); 
} 

Тест вызов (истина) дает "blubb1 == blubb1 == blubb65".

Тест вызова (false) дает «blubbA == blubb65 == blubb1».

Что объясняет это неожиданное поведение?

+0

Вы, вероятно, будет лучше писать одно заявление в каждой строке, когда кодирование - это сделаю вашу жизнь намного легче отлаживать такие вещи! –

ответ

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() 
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 является явным преобразованием.

В тернарном операторе используется неявное преобразование.

Смежные вопросы