2012-01-17 98 views
0

使用以下代碼訪問,所有引起編譯錯誤(.NET 2):WebHeaderCollection,通過索引

var headers = new WebHeaderCollection(); 
var a = headers[0]; 
var b = headers[(int)0]; 
const int FIRST_HEADER = 0; 
var c = headers[FIRST_HEADER]; 

所有失敗:呼叫是以下方法或屬性之間曖昧:「System.Net .WebHeaderCollection.this [System.Net.HttpRequestHeader]'和'System.Net.WebHeaderCollection.this [System.Net.HttpResponseHeader]'。

我可以在某種程度上理解爲什麼(a)會失敗,因爲重載接受HttpRequestHeader/HttpResponseHeader枚舉;但(b)和(c)隱式轉換爲int類型。

以下工作:

var headers = new WebHeaderCollection(); 
int index = 0; 
var d = headers[index]; 

我只碰到這個編寫一些測試的時候來了,並在需要證明加入預期頭的能力(在我的情況會永遠只有一個!)

爲什麼我要聲明一個變量 int類型來使用這個重載?

+0

我不認爲'var'關鍵字被引入到.NET 3.5之前。你已經將這個問題標記爲.net 2.0。 – 2012-01-17 14:12:00

+0

@DavidHoerster:不錯,但是我相信問題是.net2框架/編譯器,而不是.net3/3.5帶來的增加。 – 2012-01-17 18:31:30

回答

1

在所有情況下,表達式都被認爲是「值爲零的常量表達式」 - 可以隱式轉換爲任何枚舉類型。

您以後的代碼可以工作,因爲您正在有效地丟失常量,因此可以刪除隱式轉換。實際上,在C#編譯器中存在一個bug,這意味着它會將值爲零的任何常量表達式視爲可轉換爲任何枚舉類型的值 - 因此,這也適用,但不應該「 t:

HttpRequestHeader weird = 0.0; 
+0

我看到int類型的隱式可轉換常量如何導致(a)和(c)的編譯錯誤。然而,(b)顯式轉換爲int - 爲什麼這不是針對正確的索引器?優化器是否刪除了轉換? – 2012-01-17 18:17:30

+0

@SimonLaing:即使在'b'中投射後,它仍然是一個常量值。 – 2012-01-17 18:19:00

+0

我沒有在.net4框架中試過這個,會不會提供相同的結果? – 2012-01-17 18:21:25