Какого типа я могу ожидать от тернарной операции?

Возможный дубликат:
Почему этот код недействителен в C #?
Условный оператор не может привести к неявному преобразованию?

Если я сделаю следующее:

bool someBool = false;
uint value = 0;

Это нормально:

value = (someBool) ? 0 : (uint)1;
value = (someBool) ? (uint)0 : 1;

Но это не так:

value = (someBool) ? 0 : 1;

Почему я не могу использовать последний, если могу легко сказать:

value = 0;
value = 1;

Как определяется тип тернарного оператора?


person NominSim    schedule 14.06.2012    source источник


Ответы (3)


Мое краткое резюме:

  var x = c ? a : b;

Компилятор попробует, если b может быть преобразован в тип a, иначе, если a преобразован в тип b. Если ни то, ни другое невозможно, возникает ошибка.

Но в

 uint value = (someBool) ? 0 : 1;

тернарный оператор просто возвращает int (здесь и a, и b целые числа).

Переменная слева от присвоения не учитывается при определении типа.

person Henk Holterman    schedule 14.06.2012

Вы должны привести его к uint, чтобы компилятор знал. И 0, и 1 могут быть uint или int.

Вот спецификация языка (которую можно загрузить с сайта MSDN здесь):

Второй и третий операнды оператора?: Управляют типом условного выражения. Пусть X и Y - типы второго и третьего операндов. Потом,

Если X и Y одного типа, то это тип условного выражения.

В противном случае, если существует неявное преобразование из X в Y, но не из Y в X, тогда Y является типом условного выражения.

В противном случае, если существует неявное преобразование из Y в X, но не из X в Y, то X является типом условного выражения.

В противном случае невозможно определить тип выражения и возникает ошибка времени компиляции.

person Bryan Crosby    schedule 14.06.2012
comment
Не может быть лучше, чем спецификация языка :) - person riwalk; 14.06.2012
comment
Спасибо, вы можете опубликовать ссылку, где вы это нашли? Я проверил msdn и не нашел этого. - person NominSim; 14.06.2012
comment
@NominSim: предоставил вам ссылку. - person Bryan Crosby; 14.06.2012

Если вы не приведете ни одно из чисел к uint, компилятор предположит, что результатом тернарного оператора является int, который не может быть неявно преобразован в uint.

person O. R. Mapper    schedule 14.06.2012