Conversión requerida utilizando el operador condicional ternario C #

Estoy tratando de averiguar por qué se requieren yesos en los siguientes ejemplos:

bool test = new Random().NextDouble() >= 0.5;
short val = 5;

// Ex 1 - must cast 0 to short
short res = test ? 5 : 0;  // fine
short res = test ? val : 0;  // error
short res = test ? val : (short)0;  // ugly

// Ex 2 - must cast either short or null to short?
short? nres = test ? val : null;  // error
short? nres = test ? (short?)val : null;  // ugly
short? nres = test ? val : (short?)null;  // ugly
short? nres = test ? val : default(short?);  // ugly

El primer ejemplo me parece una locura. Sishort i = 0; compila, ¿por qué el compilador no puede tratar implícitamente el 0 (o cualquier otro válidoshort valor) comoshort en el código anterior?

El segundo ejemplo tiene más sentido para mí. Entiendo que el compilador no puede determinar el tipo de expresión en el lado derecho del=, pero en mi opinión, debe tener en cuenta los tipos anulables al hacerlo.

Me gustaría entender si hay un razonamiento real detrás de estos errores del compilador.

Respuestas a la pregunta(1)

Su respuesta a la pregunta