2013-11-22 77 views
5

如果有下面的語句:爲什麼這個內聯錯了?

return this.revision.HasValue ? this.revision : throw new InvalidOperationException(); 

我認爲是拋出是打破正常流程將編譯,它不應該是沒有返回值的問題,但它並沒有建立。

有沒有辦法把這個陳述正確或爲什麼不允許?

謝謝。

編輯: this.revision是int?該方法返回int。

編輯2:如果我有這個方法

public int Test() 
{ 
    throw new Exception(); 
} 

編譯器不會抱怨沒有返回值,我預計從行內同樣的事情,如果......至少我們知道,可以因爲它已經在方法中完成了。

+2

什麼是你的方法的返回類型? – Christos

+4

從msdn:第一個表達式和第二個表達式的類型必須相同,或者從一個類型到另一個類型必須存在隱式轉換。 http://msdn.microsoft.com/en-us/library/ty67wk28(v=vs.110).aspx – Ric

+1

提供您的(視覺工作室)錯誤信息。乍一看,修正!=例外。 – mnemonic

回答

3

我想問題在於,this.revision是一個可爲空的類型,而InvalidOperationException()是一個SystemException。 if語句就像你不能有兩種不同類型的在:

return (a>b)? DateTime.Now : 2; 

請看這裏:http://msdn.microsoft.com/en-us/library/vstudio/ty67wk28.aspx

條件? first_expression:second_expression;

該條件必須評估爲真或假。如果條件爲真,first_expression將被計算併成爲結果。如果條件爲false,則second_expression將被計算併成爲結果。只有兩個表達式中的一個被評估。

第一個表達式和第二個表達式的類型必須是相同的,或者必須存在從一種類型到另一種類型的隱式轉換。

+0

我希望編譯器足夠聰明,以實現在這種情況下,返回值無關緊要... –

+0

@SoMoS三元運算符要求類型是相同或可隱式轉換http://msdn.microsoft.com/ en-us/library/ty67wk28%28v = vs.110%29.aspx – Gusdor

13

轉換評論到應答:

從MSDN:

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

?: Operator

int?不能轉換到一個異常,並拋出不是表達式,因此代碼中的錯誤。

+0

同樣,我希望編譯器足夠聰明,可以認識到在這種情況下,返回值並不重要......檢查我的編輯 –

+0

,但它略微不同於傳統的if..else聲明,因爲它的類型必須匹配或能夠轉換爲賦值。 – Ric

+5

「我希望計算機違反它的編程規則並閱讀我的想法,請幫助,互聯網。」 – Gusdor

2

這是因爲在ternary expression中,後兩個表達式相互替代,它們的返回值需要是相同類型或可以隱式轉換爲所分配變量的類型。
顯然,Exceptionint類型不同。

MSDN:

如果條件爲假,second_expression被評估併成爲結果

1

這是因爲?:的第二個操作數需要是表達式而不是throw語句。

所以你可以做是 -

public static T ThrowException<T>() 
{ 
    throw new Exception(); 
} 

什麼,並用它在你的發言

return this.revision.HasValue ? this.revision :ThrowException<bool>(); 
1

C#編譯器可以允許這一點,比現在它可以做很多事情。問題在於寫入功能並支持它的成本。請參閱Eric Gunnerson's blog post概述新功能決策流程。

+0

當您投票時請留下評論... – ya23

相關問題