C#中數組索引的類型是什麼?C#中數組索引的類型?
例如,在下面的代碼中,在訪問數組元素(第三行)之前,索引是否會被轉換爲int?
T[] myArray = new T[255];
byte index = 2;
T element = myArray[index];
如果不是,它更快地通過使用類型「字節」的指數大於類型「INT」的索引訪問數組元素?
感謝
C#中數組索引的類型是什麼?C#中數組索引的類型?
例如,在下面的代碼中,在訪問數組元素(第三行)之前,索引是否會被轉換爲int?
T[] myArray = new T[255];
byte index = 2;
T element = myArray[index];
如果不是,它更快地通過使用類型「字節」的指數大於類型「INT」的索引訪問數組元素?
感謝
原來的答覆:
是的,它總是一個int
一個數組訪問表達式。其他索引器(例如Dictionary<,>
)可以有其他參數類型,但數組訪問索引始終是int
,如果需要(通過您的示例)進行升級。
但是等一下!
實際上,在看剖面的C#5規範的7.6.6.1,我不爲肯定:
對於數組訪問時,元件的初級無陣列創建表達式-access必須是數組類型的值。此外,數組訪問的參數列表不允許包含命名參數。參數列表中的表達式的數量必須與數組類型的秩相同,並且每個表達式的類型必須是
int
,uint
,long
,ulong
,或者必須可以隱式轉換爲這些類型中的一個或多個。 評估數組訪問的結果是數組元素類型的變量,即由參數列表中的表達式的值選擇的數組元素。對P [A]形式的數組訪問的運行時處理,其中P是數組類型的主要非數組創建表達式,A是參數列表,由以下步驟:
P
被評估。如果此評估導致異常,則不執行進一步的步驟。參數列表的索引表達式按從左到右的順序進行評估。在對每個索引表達式進行評估之後,執行以下類型之一的隱式轉換(第6.1節):
int
,uint
,long
,ulong
。隱式轉換所在的列表中的第一個類型被選中。例如,如果索引表達式是short
類型,則執行到int
的隱式轉換,因爲從short
到int
和從short
到long
的隱式轉換是可能的。如果評估索引表達式或後續隱式轉換會導致異常,則不會評估其他索引表達式,也不會執行其他步驟。
事實上此代碼的工作:
string[] array = new string[10];
long index = 10;
string element = array[index];
所以你的具體情況的byte
而將被晉升爲int
,訪問索引訪問並非總是通過int
。
即使在.NET 4.5中的「大陣列」的支持,我不認爲您可以創建超過int.MaxValue
元素的數組,但我可能是錯的。 (我現在沒有時間來測試它,恐怕。)
在.NET 4.0中,值大於int.MaxValue的值失敗。 – 2014-06-09 20:45:54
我很驚訝,這個問題似乎之前沒有被問到過C#。爲了完整起見,可能有興趣提及C++(http://stackoverflow.com/q/8111357/96780)和「C99」(http://stackoverflow.com/questions/3174850/type-for-陣列索引中-C99)。 – 2013-05-10 16:19:23