2012-03-15 55 views
8

當在C#方法參數中爲uint參數指定默認值時,如下面的第一個代碼塊所示,我得到消息「一個類型爲'int'的值不能用作默認參數,因爲存在沒有標準的轉換來鍵入'uint'「,而當在方法體中爲一個uint變量分配一個int時,它是沒問題的。爲什麼將一個整數值賦給C#方法參數中的一個uint參數是無效的?

該代碼確實編譯;該警告是由紅色的方式提供,在Visual Studio中的波浪下劃線2010

void GetHistoricData(uint historyLength = 365) 
{ 
    uint i = 365; // this is valid 
} 

這是很容易解決的,通過代替365使用365U,即:

void GetHistoricData(uint historyLength = 365U) 
{ 
    // method body 
} 

我發現它真的很難找到一個很好的解釋,爲什麼在其他地方有效的時候在參數中指定intuint是無效的。任何人都可以幫我用我想找到的'燈泡'時刻嗎?

+1

紅色下劃線應該表示您無法編譯。你有沒有嘗試重新啓動VS? – Tsabo 2012-03-15 11:03:47

+1

我相信這是特定於您的設置:警告不顯示在我的代碼與「紅色,波浪下劃線」。 – 2012-03-15 11:05:12

+0

當下劃線突出顯示時,Visual Studio重新啓動引發ReSharper顯示其左側燈泡,表明這只是ReSharper警告中的一個。 – Jason 2012-03-15 11:08:26

回答

1

它爲我編譯,4.0.30319.1和4.0.30319.17379的編譯器版本。

如果您使用的是舊版本或不同的編譯器(例如Mono版本),那麼我懷疑它只是一個錯誤。

編輯:如果它編譯罰款(我不能招惹的警告從編譯器在所有),那麼我懷疑它的一些插件,如ReSharper的。 (並不是說我在ReSharper中看到它)

我無法在VS2010中重現此操作。

我會建議你做更新代碼到一個沒有報警,只是可讀性的原因 - 但它仍然是有效代碼,而無需改變。

+0

它也符合我的要求。我應該提到,所以我會更新這個問題。該警告是VS2010中的紅色波浪線消息,而不是構建錯誤。 – Jason 2012-03-15 10:57:46

+1

這可能是因爲可選參數的工作方式,這裏實際發生的是值的注入到調用方法,顯然編譯器認爲這不是一個好主意,做到這一點,而不吐出一個警告 – ntziolis 2012-03-15 11:00:24

+0

它似乎是畢竟一個ReSharper提示;在重新啓動VS後,R#燈泡現在開始出現(有時),當波浪線被淹沒時。 – Jason 2012-03-15 11:06:05

1

考慮到你正在做一個演員,所以也可能截斷的價值,我推測時,Visual Studio僅警告你有關潛在問題的一個事實可能發生,邀請你作出這樣的投esplicit 。特別是如果我們正在談論默認參數,應該明確指定默認值。相反,如果是非隱式投射,總會有疑惑的空間,以及投射值會是什麼樣子。

1

紅色下劃線通常意味着您無法編譯。 VS上的代碼分析器有時會出錯,產生錯誤的錯誤消息和警告,但仍然可以編譯。重新啓動VS通常會擺脫它們。

相關問題