2012-03-07 5 views
2

Может ли кто-нибудь объяснить мне, что происходит за кулисами при использовании тройного оператора? ли эта строка кода:Тернарный оператор в C#

string str = 1 == 1 ? "abc" : "def"; 

генерируется как простой, если/другое заявление? Рассмотрим следующее:

class A 
{ 
} 

class B : A 
{ 
} 

class C : A 
{ 
} 

Теперь, используя трехкомпонентную выражение следующим образом:

A a1 = 1 == 1 ? new B() : new C(); 

это даже не компилировать с этой ошибкой:

Type of conditional expression cannot be determined because there is no implicit conversion between 'ConsoleApp1.B' and 'ConsoleApp2.C'

Может кто-нибудь пролить свет на этот ?

+0

Посмотрите этот ответ: http://stackoverflow.com/a/4290218/26396 –

+1

Примечание: это не совсем о CLR, и хотя его * * тернарный оператор (и единственный, как это бывает) оператор * имя * является условным оператором. –

ответ

1

Условный оператор будет эффективно использовать тип первого выражения для второго в зависимости от того, есть ли конверсия - и не учитывает базы (в противном случае он всегда будет идти до object, позволяя это: ? "hello" : 10).

В этом случае компилятор верен - между этими двумя типами нет никакого преобразования. Добавьте бросок, однако на первом - и он скомпилирует - (A)new B().

8

Типа условного выражения оператора требуется, чтобы быть либо типа второго операнда или типа третьего операнда. Поэтому один из них должен быть конвертируемым в другой.

В вашем случае они не конвертируются друг в друга, но оба конвертируются в третий тип (A). Это не считается компилятором, но вы можете заставить его:

A a1 = 1 == 1 ? new B() : (A) new C(); 

или

A a1 = 1 == 1 ? (A) new B() : new C(); 

См раздел 7,14 в спецификации C# 4 для получения более подробной информации.

2

Экстракт из msdn ?Operator

If condition is true, first expression is evaluated and becomes the result; if false, the second expression is evaluated and becomes the result. Only one of two expressions is ever evaluated.

Его довольно явные.

И ваша ошибка довольно явно слишком, вы пытаетесь присвоить B к C ... Но ни литая не доступен, так что ошибка ... Довольно простой

0

Its pretty explicit.

And your error is pretty explicit too, you are trying to assign a B to a C ... But no cast is available, so error ... Pretty simple

Не имеет значения вообще.

В и С, происходит от A.

Выражение:

A A1 = 1 == 1? новый B(): новый C();

Оба выражения возвращают тип, производный от A

Просто компилятор смотрит на выражениях оператора?:, И не важно, что это тип переменной a1 (левая часть выражения) .. , Причина такой реализации очень интересна ...

Смежные вопросы