Сомнения по поводу ключевого слова 'var' и тернарного оператора ?:

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

class A {
}
class B : A {
}

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

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

object x = something ? 1 : ""

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

Связанный вопрос (о тернарном операторе):
Почему не удается присвоить null в тернарном операторе: нет неявного преобразования между null и int?


person Oscar Mederos    schedule 22.06.2011    source источник


Ответы (3)


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

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

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

См. здесь:

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

condition ? first_expression : second_expression;

[...]

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

person user541686    schedule 22.06.2011
comment
Итак, статический тип всегда будет A? Любая документация, в которой объясняется поведение ключевого слова var в этих контекстах? - person Oscar Mederos; 22.06.2011
comment
@Oscar: Да, если A сам по себе является распространенным типом (как здесь). Не уверен насчет ссылки, но дам знать, если найду. - person user541686; 22.06.2011
comment
@Mehrdad Интересно ... Спасибо за ответ. - person Oscar Mederos; 22.06.2011
comment
@Оскар: Конечно. См. обновление (ссылка) для документации, если вам интересно. - person user541686; 22.06.2011
comment
Вы имели в виду «произошла ошибка компилятора», я думаю, вы забыли слово error. Я не буду редактировать, хотя, потому что я не уверен. знак равно - person Miguel Angelo; 22.06.2011
comment
@Miguel: Ха-ха, да, действительно, спасибо, что указали на это! знак равно - person user541686; 22.06.2011
comment
@Mehrdad Еще раз спасибо. Я ошибся в поведении оператора ?: :(. Я всегда думал, что может быть допустимо следующее: object x = (k == 0) ? 1 : "Test", но, как указывает документация, это вообще невозможно :) - person Oscar Mederos; 22.06.2011
comment
@Oscar: Я тоже совершаю эту ошибку, когда пишу код, я думаю, что это естественно. :) - person user541686; 22.06.2011
comment
FYI — раздел 7.14 спецификации языка C# - person Eric Olsson; 22.06.2011

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

person Yuriy Faktorovich    schedule 22.06.2011

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

person Richard Schneider    schedule 22.06.2011
comment
Совершенно бесполезный ответ. Я спрашиваю, как это работает, что делает компилятор, а не только то, что происходит. Конечно, я могу открыть Visual Studio и протестировать его. На самом деле (1) не - person Oscar Mederos; 22.06.2011