C# почему тернарный оператор требует явного приведения?
Зачем мне нужен явный бросок в этом случае:
class Program { static void Main() { bool boolVal = true; Animal a = boolVal ? new Dog() : new Cat(); } } class Animal { } class Dog : Animal { } class Cat : Animal { }
В этой строке: "животное a = boolVal ? new Dog() : new Cat();" я получу ошибку компилятора "тип условного выражения не может быть определен, потому что нет явного преобразования между Dog и Cat".
Но если я добавлю приведение к животному перед "new Dog ()", компилятор не будет жаловаться. Разве мне не нужно также использовать второе выражение ? Что это за странное поведение? :головная боль:
То же самое относится и к типам значений:
static void Main() { bool randomBool = true; short someRandomVal = 5; short s = randomBool ? someRandomVal : 0; // Won't work }
Однако здесь мне нужно привести второе значение, а не первое, потому что первое уже короткое.
Что я уже пробовал:
Однако, глядя на документацию для тернарного оператора, я не увидел там ничего, связанного с этим поведением.
0x01AA
Это вы найдете в разделе замечание в MS Docs:
"Либо типы first_expression и second_expression должны быть одинаковыми, либо должно существовать неявное преобразование из одного типа в другой."
0x01AA
Кстати, оба они будут компилироваться:
Животное а = булвал ? (Животное)Собака() : новый кот();
Животное а = булвал ? новая собака() : (животное)новая кошка();