呼び出して、C# でゼロ以外の下限 1 次元配列を作成したい
Array.CreateInstance(typeof(int), new int[] { length }, new int[] { lower });
返される配列の型は int[] ではなく、int[*] です。誰でもこれが何を意味するのか詳しく説明できますか? この配列を呼び出し元に返すことができるようにしたいです。たとえば、
int[] GetArray() { ... }
ありがとう。
呼び出して、C# でゼロ以外の下限 1 次元配列を作成したい
Array.CreateInstance(typeof(int), new int[] { length }, new int[] { lower });
返される配列の型は int[] ではなく、int[*] です。誰でもこれが何を意味するのか詳しく説明できますか? この配列を呼び出し元に返すことができるようにしたいです。たとえば、
int[] GetArray() { ... }
ありがとう。
はい、これは落とし穴です!
ベクトルと 1 次元配列には違いがあります。Anint[]
はベクトルです。ベクトル ( などint[]
)は0 ベースでなければなりません。それ以外の場合は、それを呼び出す必要がありますArray
。例えば:
// and yes, this is doing it the hard way, to show a point...
int[] arr1 = (int[]) Array.CreateInstance(typeof(int), length);
または(これはまだゼロベースであることに注意してください):
int[] arr2 = (int[]) Array.CreateInstance(typeof (int),
new int[] {length}, new int[] {0});
配列を 0 ベースにできない場合は、申し訳ありません: ではなく を使用する必要がありますArray
。int[]
Array arr3 = Array.CreateInstance(typeof(int),
new int[] { length }, new int[] { lower });
さらに混乱させるために、次の違いがあります。
typeof(int).MakeArrayType() // a vector, aka int[]
typeof(int).MakeArrayType(1) // a 1-d array, **not** a vector, aka int[*]
検証する実際のコードが見つかりませんが、その構文を試してみると、基数がゼロでない 1 次元配列を示しているようです。
ここに私の結果があります:
0-Based 1-D Array : "System.Int32[]"
Non-0-based 1-D Array: "System.Int32[*]"
0-based 2-D Array : "System.Int32[,]"
Non-0-based 2-D Array : "System.Int32[,]"
必要なのは1次元配列だけの場合、これでうまくいくはずです
Array.CreateInstance(typeof(int), length)
lowerBound を指定すると、かなり異なる場合に型が返されます
var simpleArrayType = typeof(int[]);
var arrayType = Array.CreateInstance(typeof(int), 10).GetType();
var arrayWithLowerSpecifiedType = Array.CreateInstance(typeof(int), 10, 5).GetType();
Console.WriteLine ( arrayType == simpleArrayType ); //True
Console.WriteLine ( arrayWithLowerSpecifiedType == simpleArrayType ); //False