Esta es una pregunta bastante frecuente.
En C#, casi siempre razonamos desde adentro hacia afuera. Cuando vea
x = y;
trabajamos lo que es el tipo de x, ¿cuál es el tipo de y, y si el tipo de y es compatible con la asignación x. Pero no usamos el hecho de que sabemos cuál es el tipo de x cuando estamos trabajando en el tipo de y.
Eso es porque puede haber más de una 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
Nos necesidad de ser capaz de trabajar a cabo el tipo de una expresión sin saber lo que está siendo asignado a.Escriba flujos de información de una expresión, no en una expresión.
Para calcular el tipo de expresión condicional, calculamos el tipo de consecuencia y las expresiones alternativas, seleccionamos el más general de los dos tipos, y eso se convierte en el tipo de expresión condicional. Entonces en su ejemplo, el tipo de expresión condicional es "int", y no es una constante (a menos que la expresión de condición sea constante verdadera o constante). Como no es una constante, no puedes asignarla a byte; el compilador solo razona de los tipos, no de los valores, cuando el resultado no es una constante.
La excepción a todas estas reglas son las expresiones lambda, donde la información de tipo hace fluir del contexto a la lambda. Conseguir esa lógica correcta fue muy difícil.
posible duplicado de [Tipos anulables y el operador ternario: ¿por qué es \ '? 10: null \ 'prohibited?] (Http://stackoverflow.com/questions/858080/nullable-types-and-the-ternary-operator-why-is-10-null-forbidden) – nawfal