2010-05-21 32 views
8

一個小問題。任何想法的傢伙爲什麼這不起作用?如何使用帶空值的條件操作Int

int? nullableIntVal = (this.Policy == null) ? null : 1; 

我試圖返回null如果左手錶達式爲true,否則1。看起來很簡單,但給編譯錯誤。

無法確定條件表達式的類型,因爲在nullint之間沒有隱式轉換。

如果我用? null : 1中的null替換爲任何有效的int,則沒有問題。

回答

20

是 - 編譯器無法找到條件表達式合適的類型。忽略將它分配給int?的事實 - 編譯器不使用該信息。所以表達式是:

(this.Policy == null) ? null : 1; 

這個表達式的類型是什麼?語言規範規定它必須是第二個操作數的類型或第三個操作數的類型。 null沒有類型,所以它必須是int(第三個操作數的類型) - 但是沒有從nullint的轉換,所以它失敗。

演員兩個操作數以int?,它會工作,或使用expessing null值的另一種方式 - 因此,任何這些:

(this.Policy == null) ? (int?) null : 1; 

(this.Policy == null) ? null : (int?) 1; 

(this.Policy == null) ? default(int?) : 1; 

(this.Policy == null) ? new int?() : 1; 

我同意這是一個你必須這樣做有輕微痛感。


從C#3.0語言規範部分7.13:

的 的第二和第三運算數:操作者控制 條件表達式的類型。令X和Y爲 操作數的第二個和第三個 的類型。然後,

  • 如果X和Y是相同的類型,則這是該條件 表達式的類型。否則,如果從X到Y存在隱式轉換(第6.1節),但不存在從Y到X的 ,則Y是 條件表達式的類型。否則,如果從Y到X存在隱式轉換(第6.1節),但不存在從X到Y的 ,則X是 條件表達式的類型。

  • 否則,不能確定表達式類型,併發生編譯時錯誤 。

+1

令人噁心的綜合... – 2010-05-21 10:51:56

+0

瘋狂準確和準確。 – 2010-05-21 10:53:53

+0

@David:在我引用語言規範之前並不全面。我現在感覺更好:) – 2010-05-21 10:57:13

1

此作品:int? nullableIntVal = (this.Policy == null) ? null : (int?)1;

原因(從評論複製):

錯誤信息是因爲?:運營商(null1)的兩個分支沒有一個兼容的類型。新解決方案的分支(使用null(int?)1)。

+0

一個int會隱式轉換爲int嗎? - 操作系統有問題分配null爲int? – 2010-05-21 10:48:59

+0

錯誤消息是因爲?:運算符('null'和'1')的兩個分支沒有兼容類型。新解決方案的分支(使用'null'和'(int?)1')。 – 2010-05-21 10:50:19

+0

我不認爲他想讓它變成簡單的1 – KroaX 2010-05-21 10:50:28

4

試試這個:

int? nullableIntVal = (this.Policy == null) ? (int?) null : 1; 
2

也許你可以試試:

default(int?); 

,而不是空

1

int? i =(true?new int?():1);