2012-03-07 74 views
2

任何人都可以向我解釋當你使用三元運算符時幕後發生了什麼嗎? 沒有這行代碼:C中的三元運算符#

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

作爲一個簡單的if/else語句產生的? 考慮以下幾點:

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 – 2012-03-07 11:22:12

+1

注意:這不是關於CLR,雖然它的*一個*三元運算符(以及唯一的運算符),運算符*名稱*是條件運算符。 – 2012-03-07 11:22:33

回答

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(); 

見部分C#4規格的更多細節7.14。

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

不相關的。

B和C從A.派生

的表達式是:

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

兩個表達式返回從A

只是編譯器會在的表達派生類型:?運營商,不關心什麼是可變的A1(表達的左側)的類型.. 。 這種實現的原因很有趣...