2013-05-10 15 views
9

Jaki jest typ indeksu tablicy w języku C#?Typ indeksu tablicy w C#?

Na przykład, w poniższym kodzie, czy indeks byłby rzutowany w int przed uzyskaniem dostępu do elementu tablicy (trzecia linia)?

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

Jeśli nie, jest to szybciej uzyskać dostęp do elementu tablicy przy użyciu indeksu typu „bajt” niż indeks typu „int”?

Dzięki

+0

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). –

Odpowiedz

8

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ę.)

+0

W wartości .NET 4.0 większe niż wartość int.MaxValue. –