Сомнения по поводу ключевого слова 'var' и троичного оператора? - PullRequest
4 голосов
/ 22 июня 2011

Если ключевое слово var разрешено во время компиляции, как работает следующее?

class A {
}
class B : A {
}

int k = 1;
var x = (k < 0) ? new B() : new A();

Edit:
Наконец я понял, что проблема не в самом var, а в поведении оператора ?:. По какой-то причине я подумал, что возможно следующее:

object x = something ? 1 : ""

и это вообще невозможно:)

Смежный вопрос (о троичном операторе):
Почему присвоение нуля в тернарном операторе завершается неудачно: неявное преобразование между нулем и целым числом?

Ответы [ 3 ]

13 голосов
/ 22 июня 2011

Результат имеет тип A, потому что обе переменные имеют тип A, и, по крайней мере, одна из них напрямую типа A (не путем некоторого преобразования).

Компилятор просматривает обе части троичного выражения, и если одна из них является подтипом другой, все выражение становится более общим супертипом.

Однако если ни один из них не относится непосредственно к общему типу, то возникает ошибка компилятора , возможно, потому, что он не знает, сколько нужно выкинуть (и не хочет выяснять).

См. здесь :

Условный оператор (? :) возвращает одно из двух значений в зависимости от значения логического выражения.Ниже приводится синтаксис для условного оператора.

condition ? first_expression : second_expression;

[...]

Либо тип first_expression и second_expression должен совпадать, либо неявное преобразование должно существовать из одного типак другому.

2 голосов
/ 22 июня 2011

Результат A.Простой способ подтвердить это - навести курсор мыши на var.

0 голосов
/ 22 июня 2011

Я не проверял этот вырожденный случай. Но я хотел бы поспорить, что (1) жалобщик компилятора или (2) x имеет тип «A».

...