Это довольно часто задаваемый вопрос.
В C # мы почти всегда рассуждаем изнутри наружу. Когда вы видите
x = y;
мы выясняем, какой тип x, какой тип y, и совместим ли тип y с присваиванием x. Но мы не используем тот факт, что мы знаем, что тип х, когда мы работаем над типом у.
Это потому, что может быть более одного x:
void M(int x) { }
void M(string x) { }
...
M(y); // y is assigned to either int x or string x depending on the type of y
Нам нужно , чтобы иметь возможность определить тип выражения без , зная, для чего оно присваивается. Введите информацию о потоках из выражения, а не в выражения.
Чтобы определить тип условного выражения, мы определяем тип следствия и альтернативные выражения, выбираем более общий из двух типов, и это становится типом условного выражения. Итак, в вашем примере тип условного выражения - «int», и он не является константой (если только выражение условия не является константой true или константой false). Поскольку это не константа, вы не можете присвоить ее байту; компилятор рассуждает исключительно из типов, а не из значений, когда результат не является константой.
Исключением из всех этих правил являются лямбда-выражения, где информация о типе делает поток из контекста в лямбду. Правильно понять эту логику было очень сложно.