Обязательное приведение с использованием C # троичного условного оператора

Я пытаюсь выяснить, почему приведение типов требуется в следующих примерах:

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

Первый пример просто кажется мне безумным. Еслиshort i = 0; компилирует, почему компилятор не может неявно обрабатывать 0 (или любой другой допустимыйshort значение) какshort в приведенном выше коде?

Второй пример имеет больше смысла для меня. Я понимаю, что компилятор не может определить тип выражения в правой части=, но IMO должен принимать во внимание обнуляемые типы при этом.

Я хотел бы понять, есть ли реальные причины этих ошибок компилятора.

Ответы на вопрос(1)

Ваш ответ на вопрос