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.