2010-09-20 45 views
1

#編譯器行爲的C#4.0編譯器不會抱怨這一點(甚至沒有警告):真正時尚的C可空文字

if(10.0 > null + 1) 
{  
} 

if (myDoubleValue > null) 
{ 
} 

它似乎總是錯誤的。這裏發生了什麼?空值是否自動轉換爲Nullable<double>什麼的?

如果是這樣,爲什麼不這項工作,那麼:

double myDoubleValue = null + 1; 

另外,爲什麼我會永遠想這樣的行爲。爲什麼玩這種文字可能是件好事。

回答

8

分配不起作用的原因是,結果的類型爲double?,而不是double。結果將始終爲double?(又名Nullable<double>)類型的空值。

哦,並且兩個前兩個塊使編譯器的抱怨,有這樣的警告:

test.cs中(7,19):警告CS0458:表達式的 結果總是 類型'int?'的'null'
Test.cs(12,13): 警告CS0464:與空值 類型'double?'比較總是產生「假」

管理沒有錯誤編譯是不一樣的沒有抱怨:)

+0

正確的我不小心關閉了警告。在警告打開的情況下,我甚至不需要提問,因爲編譯器解釋了警告中的所有內容。 – bitbonk 2010-09-20 22:04:57

2
if(10.0 > null + 1) 
{ 

} 

實際上等同於:

int? i = null + 1; // i.HasValue = false in this case 
if(10.0 > i) 
{ 

} 

所以你實際上是試圖將不可空的類型與不具有值的可空類型進行比較。

double myDoubleValue = null + 1; 

不能編譯,因爲右手的類型是int?,而不是double

也是這個問題只是出於好奇心試圖#%= ^編譯器或者你實際上是在一個真實的項目中寫這樣的東西?

+0

當然不是。我的代碼中有一個錯誤,導致錯誤的行爲。在調試過程中,我發現了這個錯字,並想知道爲什麼沒有人警告過這個問題。稍後我會注意到,我意外地禁用了visual studio中的警告選項卡。 – bitbonk 2010-09-20 22:08:42