Какъв тип мога да очаквам от троична операция?

Възможен дубликат:
Защо този код е невалиден в 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;

троичният оператор просто връща inta, и b тук са int).

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

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