Обязательное приведение с использованием 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 должен принимать во внимание обнуляемые типы при этом.
Я хотел бы понять, есть ли реальные причины этих ошибок компилятора.