2010-11-27 25 views

回答

25

編譯器忽略左側時,找出右側的類型。所以,當它試圖推斷類型的

Int64.Parse(myOtherVar) == 0 ? null : Int64.Parse(myOtherVar) 

它這樣做無需支付任何注意一個事實,左手側是long?。以確定它注意到

Int64.Parse(myOtherVar) 

long現在試圖查看是否null是或者可以被隱式轉換爲long右手側的類型。由於它不能,你會看到你看到的錯誤信息。

從C#規範的§7.14:

形式b ? x : y ....

第二和第三運算數,xy的條件表達式?:操作員控制的,該類型的條件表達式。

(1)如果x有類型Xy有類型Y然後

一個。如果存在從XY而不是從YX的隱式轉換(第6.1節),則Y是條件表達式的類型。

b。如果存在從YX而不是從XY的隱式轉換(第6.1節),則X是條件表達式的類型。

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

(2)如果只xy一個有一個類型,並且兩個xy,areimplicitly轉換爲這種類型的,那麼這就是條件表達式的類型。

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

注意,我們是在情況(2)其中xnull,沒有一個類型,yInt64.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 
} 
+0

奇怪的是,Int64.Parse(myOtherVar)== 0? (long?)null:Int64.Parse(myOtherVar);作品。 – 2010-11-27 05:11:11

2

由於三元運算符的最後部分,您的運營商使用返回的是Int64,而不是nullable。如果你這樣做,而不是它可能工作:

long? myVar = Int64.Parse(myOtherVar) == 0 ? null : 
    (long?)Int64.Parse(myOtherVar); 

讓您在返回long?代替,所以null不需要轉換爲Int64

此外,要轉換的值的兩倍您代碼,不必要的(一次測試,一次獲得值)。您的代碼可能會更好,因此:

long? tempVar = Int64.Parse(myOtherVar); 
long? myVar = tempVar==0? null : tempVar; 
2

我相信你的意思是說:的

myVar = value == 0 ? null : (long?)value; 

代替

myVar = value == 0 ? null : value; 

我喜歡 '出' 變量的使用。 謝謝。

0

這將工作:

long? myVar = (long?)myOtherVar == 0 ? null : (long?)myOtherVar; 

..for那些誰喜歡簡短的回答。

0

編譯器試圖從左至右

long? myVar = Int64.Parse(myOtherVar) == 0 ? null : Int64.Parse(myOtherVar); 

int64.parse方法返回一個值long不是nullable長值計算表達式。所以nullInt64.Parse(myOtherVar); 所以之間沒有轉換,試試這個

long? myVar = Int64.Parse(myOtherVar) == 0 ? (long?) null : Int64.Parse(myOtherVar); 

OR
long? myVar = Int64.Parse(myOtherVar) == 0 ? null : (long?) Int64.Parse(myOtherVar);

相關問題