Ответ 1
Почему я не могу использовать
uint a = b == c ? 0 : 1;
?
Тип выражения b == c ? 0 : 1
равен int
. Как показано в в этой таблице, нет никакого неявного преобразования из int
в uint
, поэтому это не разрешено.
Почему я могу использовать
a = 0
?
Потому что существует специальная обработка числовых типов, когда значение является постоянным выражением.
Из раздела 6.1.9 спецификации С#:
Константное выражение типа int может быть преобразовано в тип sbyte, byte, short, ushort, uint или ulong, если значение константного выражения находится в пределах диапазона типа назначения.
Постоянное выражение типа long может быть преобразовано в тип ulong, если значение константного выражения не является отрицательным.
Как указано в первой марке a = 0
и a = 1
, оба разрешены, потому что 0
и 1
являются константными выражениями и являются действительными значениями uint
. В основном это сводится к тому, что компилятор может легко определить во время компиляции, что эти преобразования действительны, поэтому он позволяет им.
Кстати, если часть вашего первого примера b == c
была изменена на константное выражение (например, true
), тогда все условное выражение оператора будет постоянным выражением, и код будет компилироваться.