2011-09-10 192 views
1

爲什麼視覺工作室給我一個錯誤:錯誤的Visual Studio

public void afunction(int? bar){ somecode } 

afunction(String.IsNullOrEmpty(Request["foo"])?null:int.Parse(Request["foo"])); 

它給我沒有空之間沒有implcit轉換和int

回答

4

的第2和第3個操作數?運算符必須具有兼容類型。他們不在你的情況下,第二個是空的,第三個是int。沒有隱式從int到null或從null到int的轉換。只有明確的,像轉換爲對象或Nullable<int>。您可以考慮使用這樣的:這裏

afunction(String.IsNullOrEmpty(Request["foo"]) ? default(int?) : int.Parse(Request["foo"])); 

沒有問題,因爲有從int隱式轉換爲int?

+0

我明白你說的是什麼,但它似乎是語言中的一個弱點 –

+0

靜態類型語言(如C#)中的標準票價允許表達式成爲語句。這阻止了編譯器從結果類型推斷預期的轉換。在許多情況下可以這樣做,就像你的一樣,不會影響語言設計者。一致性對他們很重要。 –

1

你需要稍微改變你的方法,如:

? null : new Nullable<int>(int.Parse(Request["foo"])); 

編譯器表達,你是負責類型轉換。

+0

Resharper建議我「?null:new int?(int.Parse(Request [」idM「]))」 –

1

的簡化版本:

int? x = true ? null : 1; 

無法確定條件表達式的類型,因爲有<null>和「INT」

之間的隱式轉換所以有條件操作者不作爲工作你期望(關於類型轉換)。
重構不會傷害任何東西,只是把它分解成可讀的東西。

+0

這不是重構的問題,而是理解,謝謝 –