C#の配列インデックスの型は何ですか?
たとえば、次のコードでは、配列要素 (3 行目) にアクセスする前に、インデックスを int にキャストしますか?
T[] myArray = new T[255];
byte index = 2;
T element = myArray[index];
そうでない場合、「int」型のインデックスよりも「byte」型のインデックスを使用して配列要素にアクセスする方が高速ですか?
ありがとう
元の答え:
はい、常にint
配列アクセス式の for です。他のインデクサー(たとえば in Dictionary<,>
)は他のパラメータータイプを持つことができますが、配列アクセスインデックスは常にint
、必要に応じてプロモーションを介して(例のように)です。
ちょっと待って!
実際、C# 5 仕様のセクション 7.6.6.1 を見ると、よくわかりません。
配列アクセスの場合、element-access の primary-no-array-creation-expression は、array-type の値でなければなりません。さらに、配列アクセスの引数リストに名前付き引数を含めることはできません。引数リスト内の式の数は、配列型のランクと同じでなければならず、各式の型は、、、、である必要が
int
ありuint
ますlong
。ulong
、またはこれらの型の 1 つ以上に暗黙的に変換可能でなければなりません。配列アクセスを評価した結果は、配列の要素型の変数、つまり、引数リスト内の式の値によって選択された配列要素です。P[A] 形式の配列アクセスの実行時処理 (ここで、P は配列型の基本配列作成式ではなく、A は引数リスト) は、次の手順で構成されます。
P
評価されます。この評価で例外が発生した場合、それ以上の手順は実行されません。引数リストのインデックス式は、左から右に順番に評価されます。各インデックス式の評価に続いて、次のいずれかの型への暗黙的な変換 (§6.1) が実行されます:
int
、uint
、。暗黙的な変換が存在するこのリストの最初の型が選択されます。たとえば、インデックス式が 型の場合、toおよび fromへの暗黙的な変換が可能であるため、 to への暗黙的な変換が実行されます。インデックス式の評価または後続の暗黙的な変換によって例外が発生した場合、それ以上のインデックス式は評価されず、それ以上の手順は実行されません。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
(今はテストする時間がありません、恐れています。)