編譯器忽略左側時,找出右側的類型。所以,當它試圖推斷類型的
Int64.Parse(myOtherVar) == 0 ? null : Int64.Parse(myOtherVar)
它這樣做無需支付任何注意一個事實,左手側是long?
。以確定它注意到
Int64.Parse(myOtherVar)
是long
現在試圖查看是否null
是或者可以被隱式轉換爲long
右手側的類型。由於它不能,你會看到你看到的錯誤信息。
從C#規範的§7.14:
形式b ? x : y
....
第二和第三運算數,x
和y
的條件表達式?:
操作員控制的,該類型的條件表達式。
(1)如果x
有類型X
和y
有類型Y
然後
一個。如果存在從X
到Y
而不是從Y
到X
的隱式轉換(第6.1節),則Y
是條件表達式的類型。
b。如果存在從Y
到X
而不是從X
到Y
的隱式轉換(第6.1節),則X
是條件表達式的類型。
c。否則,不能確定表達式類型,併發生編譯時錯誤。
(2)如果只x
和y
一個有一個類型,並且兩個x
和y
,areimplicitly轉換爲這種類型的,那麼這就是條件表達式的類型。
(3)否則,不能確定表達式類型,併發生編譯時錯誤。
注意,我們是在情況(2)其中x
是null
,沒有一個類型,y
是Int64.Parse(myOtherVar)
,且類型long
。請注意,x
不會隱式轉換爲y
的類型。因此,上面的(1)和(2)都失敗了,我們導致(3)導致了編譯時錯誤,這引發了你的問題。 注意上面隱含的結論,即左側在確定右側的類型時不起作用。
爲了改善這種情況與
(long?)Int64.Parse(myOtherVar)
更換
Int64.Parse(myOtherVar)
現在,之所以
myVar = null;
是好的地方myVar
被聲明爲long?
是因爲編譯器知道有是從012開始的隱式轉換至long?
。
最後,如果myOtherVar
無法解析爲long
,則會拋出Int64.Parse
。請注意,您也正在執行兩次解析,這是不必要的。一個更好的模式是
long value;
if(Int64.TryParse(myOtherVar, out value)) {
myVar = value == 0 ? null : (long?)value;
}
else {
// handle case where myOtherVar couldn't be parsed
}
奇怪的是,Int64.Parse(myOtherVar)== 0? (long?)null:Int64.Parse(myOtherVar);作品。 – 2010-11-27 05:11:11