2011-06-22 45 views
4

如果var關鍵字在編譯時解析,如何做下面的工作?懷疑關於「無功」的關鍵字和三元運算符:

class A { 
} 
class B : A { 
} 

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

編輯:
我終於明白,問題不是關於var本身,而是對?:運營商的行爲。出於某種原因,我認爲以下可能是可能的:

object x = something ? 1 : ""

這不是不可能的:)

(約三元運算符)相關的問題:
Why assigning null in ternary operator fails: no implicit conversion between null and int?

回答

13

結果是A型的,因爲這兩個變量是A類型的,並且它們中的至少一個是直接類型A(不通過一些轉換)。

編譯器看一看在該三元表達的兩個部分,並且如果它們中的一個是另一個的子類型,則整個表達式變得更一般的超類型。

然而,如果既不是常見的一種直接,那麼編譯器錯誤發生,可能是因爲它不知道多少上溯造型爲你(和它不覺得自己是查不到)。

參見here

條件運算符(:)返回取決於布爾表達式的值的兩個值中的一個。以下是條件運算符的語法。

condition ? first_expression : second_expression; 

[...]

要麼first_expression和second_expression的類型必須是相同的,或隱式轉換必須存在從一種類型到另一個。

+0

所以,靜態類型將永遠是'A'?任何有關這些上下文中'var'關鍵字的行爲的文檔都有解釋? –

+0

@Oscar:是的,如果'A'本身就是一種常見類型(就像這裏的情況一樣)。不確定鏈接,但我會讓你知道,如果我找到它。 – Mehrdad

+0

@Mehrdad有趣......感謝您的回答。 –

2

結果是A。確認它的簡單方法是將鼠標置於var之上。

-7

我沒有測試過這種退化情況。但我敢打賭(1)編譯器抱怨或(2)'x'是'A'類型。

+0

沒有用的答案。我在問這是怎麼工作的,編譯器在做什麼,而不僅僅是發生了什麼。當然,我可以打開Visual Studio並對其進行測試。事實上,(1)不是 –