2012-04-21 75 views
4

可能重複的問題:
Conditional operator assignment with Nullable<value> types?C#條件運算符:?有可空INT

爲什麼條件運算符「?:」這裏沒有工作時,我的函數返回一個可空整數「int?」? 「返回null」的作品,但與「?:」我必須首先投下「null」爲「(int?)」。

public int? IsLongName(string name) { 

     int length = name.Length; 

     // this works without problems 
     if (name.Length > 10) { 
      return null; 
     } else { 
      return name.Length; 
     } 

     // this reports: 
     // Type of conditional expression cannot be determined because 
     // there is no implicit conversion between '<null>' and 'int' 
     return name.Length > 10 ? null : name.Length; 
    } 
+3

爲什麼不返回一個布爾? – 2012-04-21 17:26:45

+0

難道我們沒有更好的重複嗎?還是在eric的博客上?我當然記得比這個問題更好的答案。 – CodesInChaos 2012-04-21 17:30:41

+1

檢查Eric Lippert的相關博客文章:[Type inference woes,part one](http://blogs.msdn.com/ericlippert/archive/2006/05/24/type-in​​ference-woes-part-one.aspx) – CodesInChaos 2012-04-21 17:42:54

回答

5

試着改變你的最後一行是:

return name.Length > 10 ? null : (int?)name.Length; 

編譯器無法理解有什麼的返回類型:?運營商。它具有衝突的值 - null和int。通過將int轉換爲可爲空,編譯器可以理解返回類型是可爲空的,並且null也將被接受。

1

既是一個null值和int值可以隱式轉換爲int?數據類型,但對自己文字的null不是由編譯器知道是不是object其他任何東西,如果你不告訴它。沒有共同的數據類型,objectint都可以隱式轉換爲,這是編譯器所抱怨的。如Yorye所說,您可以將int轉換爲int?以讓編譯器執行轉換;您可以將int轉換爲int?以使編譯器執行轉換;您可以將int轉換爲int?。或者,您可以將null轉換爲int?,然後允許編譯爲使用從intint?的隱式轉換。

0

運算符?:的兩個條件必須是隱式兼容的。 int永遠不可能是null,所以會出現編譯時錯誤(同樣,null永遠不可能是int)。你必須施放,使用三元組無法繞過它。

我不認爲你會遇到與if語句相同的問題,因爲編譯器只會檢查該方法是否從任何給定路徑返回與返回類型相兼容的值,而不是來自任何給定路徑的返回值出口點與另一個塊的返回值隱式兼容。

0

?:運營商只有考慮其兩個可能的返回值的類型。它不知道將接收其結果的變量的類型(的確,在更復雜的表達式中,可能不存在顯式變量)。

如果其中一個返回值是null,它沒有類型信息 - 它只能檢查其他返回值的類型,並檢查是否存在轉換。我們有null和返回值類型int。沒有可用的轉換。有轉換爲int?,但這並不是?:正在考慮的可能的返回類型。