2012-06-09 89 views
6

條件運算符(?:)如何與從單個基類型繼承的兩種類型一起使用時不能工作?有條件的運算符不能使用繼承相同基類型的兩種類型

我的例子是:

ActionResult foo = (someCondition)? 
         RedirectToAction("Foo","Bar") : 
         Redirect(someUrl); 

凡長形正常工作:

ActionResult foo; 

if(someCondition) 
{ 
    foo = RedirectToAction("Foo","Bar"); 
} 
else 
{ 
    foo = Redirect(someUrl); 
} 

都返回類型,RedirectToRouteResultRedirectResult,從ActionResult繼承。

+0

你能顯示軸心狀態? –

+0

在這種情況下,它只是一個布爾。 –

+0

嘗試轉換爲基本類型:(例如:ActionResult foo =(someCondition)? (的ActionResult)RedirectToAction( 「富」, 「酒吧」): (的ActionResult)重定向(someUrl); ) –

回答

11

條件運算符(?:)在使用兩種從單一基本類型繼承的類型時不起作用?

的類型,條件表達式必須是第二操作數第三操作數的類型,具體根據語言規範的類型。編譯器不會嘗試查找通用的基本類型或兩種操作數都可以轉換爲的另一種類型。表達式的使用不會影響其類型的確定方式 - 因此變量賦值在這裏無關緊要。

至於爲什麼語言是這樣定義的 - 它使得指定,實現,測試和預測變得相當簡單。這在語言設計中很常見 - 從長遠來看,保持語言簡單通常是一個更好的選擇,即使它在某些特定情況下稍微笨拙一些。

有關更多詳細信息,請參閱C#4規範的第7.14節。

將第二個或第三個操作數投射到實際上想要的條件表達式是解決問題的方法。需要注意的是另一種情況下這通常在出現是空類型:

// Invalid 
int? a = SomeCondition ? null : 10; 

// All valid 
int? a = SomeCondition ? (int?) null : 10; 
int? b = SomeCondition ? default(int?) : 10; 
int? c = SomeCondition ? null : (int?) 10; 
+0

感謝@JonSkeet以及額外的信息和解決方案。 –

1

條件運算符不能確定從它的組分所得到的類型,其可以是RedirectToRouteResultRedirectResult。爲了解決這個問題,你應該明確的成分爲基本類型的投是(或兩者):

ActionResult foo = (someCondition) ? 
        (ActionResult)RedirectToAction("Foo","Bar") : 
        Redirect(someUrl); 
1

條件部分嘗試自行解決,無論它被分配到的變量。編譯器給出了一個警告,即它無法確定將哪個類用作返回值,因爲就條件部分而言,RedirectToRouteResult不能像RedirectResult一樣強制轉換。但是,如果只是一方被強制轉換爲基類,另一種是隱式轉換一樣,所以鑄造第一是有效的:

var foo = (someCondition)? 
        (ActionResult)RedirectToAction("Foo","Bar") : 
        Redirect(someUrl); 

,但只是在投放替代太:

var foo = (someCondition)? 
    RedirectToAction("Foo","Bar") : 
    (ActionResult)Redirect(someUrl);