odpowiedź oryginalny:
Tak, to zawsze int
dla wyrażenia dostępu do tablicy. Inne indeksatory (na przykład w Dictionary<,>
) mogą mieć inne typy parametrów, ale indeks dostępu do tablicy zawsze wynosi int
, w razie potrzeby przez promocję (jak w przykładzie).
Ale czekaj!
Faktycznie, patrząc na sekcji 7.6.6.1 specyfikacji C# 5, nie jestem tak pewny:
Dla dostępu do tablicy, głównym-no-array-tworzenie-wyrażenie elementu -access musi być wartością typu tablicowego. Ponadto, lista argumentów dostępu do tablicy nie może zawierać nazwanych argumentów. Liczba wyrażeń na liście argumentów musi być taka sama jak pozycja typu tablicy, a każde wyrażenie musi być typu int
, uint
, long
, ulong
lub muszą być niejawnie wymienialne dla jednego lub więcej z tych typów. Wynikiem oceny dostępu do tablicy jest zmienna typu elementu tablicy, a mianowicie element tablicy wybrany przez wartość (y) wyrażenia (ów) na liście argumentów.
Przetwarzanie w czasie wykonywania dostępu do macierzy formularza P [A], gdzie P jest wyrażeniem typu "tworzenie-bez-tablicy-macierzy" typu tablicowego i "A" jest listą-argumentów, składa się z następujące kroki:
P
jest oceniane. Jeśli ta ocena spowoduje wyjątek, nie zostaną wykonane żadne dalsze kroki.
Wyrażenia indeksowe listy argumentów są oceniane w kolejności od lewej do prawej. Po ocenie każdego wyrażenia indeksu wykonywana jest niejawna konwersja (§ 6.1) do jednego z następujących typów: int
, uint
, long
, ulong
. Pierwszy typ tej listy, dla której istnieje niejawna konwersja, jest wybrany. Na przykład, jeśli wyrażenie indeksu jest typu short
, wykonywana jest niejawna konwersja do int
, ponieważ możliwe są niejawne konwersje z short
na int
i od short
na long
. Jeśli ocena wyrażenia indeksu lub późniejsza niejawna konwersja powoduje wyjątek, wówczas nie są oceniane żadne dalsze wyrażenia indeksu i nie są wykonywane żadne dalsze czynności.
I rzeczywiście ten kod działa:
string[] array = new string[10];
long index = 10;
string element = array[index];
Więc gdy w danym przypadkubyte
będzie promowany do int
, dostęp wskaźnik dostępu nie zawsze jest przez int
.
Nawet z „duże tablice” wsparcie w .NET 4.5, nie myśleć że można utworzyć tablicę z ponad int.MaxValue
elementów, ale mogę się mylić. (Nie mam czasu, aby przetestować go teraz, obawiam się.)
Jestem zaskoczony, że to pytanie nie zostało wcześniej zadane dla C#. Dla kompletności, może być interesujące wspomnieć jego odpowiedniki w C++ (http://stackoverflow.com/q/8111357/96780) i "C99" (http://stackoverflow.com/questions/3174850/type-for- array-index-in-c99). –