2013-05-10 50 views
9

C#中數組索引的類型是什麼?C#中數組索引的類型?

例如,在下面的代碼中,在訪問數組元素(第三行)之前,索引是否會被轉換爲int?

T[] myArray = new T[255]; 
byte index = 2; 
T element = myArray[index]; 

如果不是,它更快地通過使用類型「字節」的指數大於類型「INT」的索引訪問數組元素?

感謝

+0

我很驚訝,這個問題似乎之前沒有被問到過C#。爲了完整起見,可能有興趣提及C++(http://stackoverflow.com/q/8111357/96780)和「C99」(http://stackoverflow.com/questions/3174850/type-for-陣列索引中-C99)。 – 2013-05-10 16:19:23

回答

8

原來的答覆:

是的,它總是一個int一個數組訪問表達式。其他索引器(例如Dictionary<,>)可以有其他參數類型,但數組訪問索引始終是int,如果需要(通過您的示例)進行升級。

但是等一下!

實際上,在看剖面的C#5規範的7.6.6.1,我不爲肯定:

對於數組訪問時,元件的初級無陣列創建表達式-access必須是數組類型的值。此外,數組訪問的參數列表不允許包含命名參數。參數列表中的表達式的數量必須與數組類型的秩相同,並且每個表達式的類型必須是int,uintlong,ulong,或者必須可以隱式轉換爲這些類型中的一個或多個。 評估數組訪問的結果是數組元素類型的變量,即由參數列表中的表達式的值選擇的數組元素。

對P [A]形式的數組訪問的運行時處理,其中P是數組類型的主要非數組創建表達式,A是參數列表,由以下步驟:

  • P被評估。如果此評估導致異常,則不執行進一步的步驟。

  • 參數列表的索引表達式按從左到右的順序進行評估。在對每個索引表達式進行評估之後,執行以下類型之一的隱式轉換(第6.1節):intuintlong,ulong。隱式轉換所在的列表中的第一個類型被選中。例如,如果索引表達式是short類型,則執行到int的隱式轉換,因爲從shortint和從shortlong的隱式轉換是可能的。如果評估索引表達式或後續隱式轉換會導致異常,則不會評估其他索引表達式,也不會執行其他步驟。

事實上此代碼的工作:

string[] array = new string[10]; 
long index = 10; 
string element = array[index]; 

所以你的具體情況的byte將被晉升爲int,訪問索引訪問並非總是通過int

即使在.NET 4.5中的「大陣列」的支持,我不認爲您可以創建超過int.MaxValue元素的數組,但我可能是錯的。 (我現在沒有時間來測試它,恐怕。)

+0

在.NET 4.0中,值大於int.MaxValue的值失敗。 – 2014-06-09 20:45:54