一個小問題。任何想法的傢伙爲什麼這不起作用?如何使用帶空值的條件操作Int
int? nullableIntVal = (this.Policy == null) ? null : 1;
我試圖返回null
如果左手錶達式爲true,否則1
。看起來很簡單,但給編譯錯誤。
無法確定條件表達式的類型,因爲在null
和int
之間沒有隱式轉換。
如果我用? null : 1
中的null
替換爲任何有效的int
,則沒有問題。
一個小問題。任何想法的傢伙爲什麼這不起作用?如何使用帶空值的條件操作Int
int? nullableIntVal = (this.Policy == null) ? null : 1;
我試圖返回null
如果左手錶達式爲true,否則1
。看起來很簡單,但給編譯錯誤。
無法確定條件表達式的類型,因爲在null
和int
之間沒有隱式轉換。
如果我用? null : 1
中的null
替換爲任何有效的int
,則沒有問題。
是 - 編譯器無法找到條件表達式合適的類型。忽略將它分配給int?
的事實 - 編譯器不使用該信息。所以表達式是:
(this.Policy == null) ? null : 1;
這個表達式的類型是什麼?語言規範規定它必須是第二個操作數的類型或第三個操作數的類型。 null
沒有類型,所以它必須是int
(第三個操作數的類型) - 但是沒有從null
到int
的轉換,所以它失敗。
演員兩個操作數以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是 條件表達式的類型。
否則,不能確定表達式類型,併發生編譯時錯誤 。
此作品:int? nullableIntVal = (this.Policy == null) ? null : (int?)1;
。
原因(從評論複製):
錯誤信息是因爲?:
運營商(null
和1
)的兩個分支沒有一個兼容的類型。新解決方案的分支(使用null
和(int?)1
)。
一個int會隱式轉換爲int嗎? - 操作系統有問題分配null爲int? – 2010-05-21 10:48:59
錯誤消息是因爲?:運算符('null'和'1')的兩個分支沒有兼容類型。新解決方案的分支(使用'null'和'(int?)1')。 – 2010-05-21 10:50:19
我不認爲他想讓它變成簡單的1 – KroaX 2010-05-21 10:50:28
試試這個:
int? nullableIntVal = (this.Policy == null) ? (int?) null : 1;
也許你可以試試:
default(int?);
,而不是空
int? i =(true?new int?():1);
令人噁心的綜合... – 2010-05-21 10:51:56
瘋狂準確和準確。 – 2010-05-21 10:53:53
@David:在我引用語言規範之前並不全面。我現在感覺更好:) – 2010-05-21 10:57:13