Fundição necessária usando o operador condicional ternário em C #

Estou tentando descobrir por que as conversões são necessárias nos seguintes exemplos:

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

O primeiro exemplo parece louco para mim. E seshort i = 0; compilações, por que o compilador não pode tratar implicitamente o 0 (ou qualquer outro válidoshort valor) comoshort no código acima?

O segundo exemplo faz mais sentido para mim. Entendo que o compilador não pode determinar o tipo da expressão no lado direito do=, mas o IMO deve levar em consideração tipos anuláveis ao fazer isso.

Eu gostaria de entender se existe um raciocínio real por trás desses erros do compilador.

questionAnswers(1)

yourAnswerToTheQuestion