12

呼び出して、C# でゼロ以外の下限 1 次元配列を作成したい

Array.CreateInstance(typeof(int), new int[] { length }, new int[] { lower });

返される配列の型は int[] ではなく、int[*] です。誰でもこれが何を意味するのか詳しく説明できますか? この配列を呼び出し元に返すことができるようにしたいです。たとえば、

int[] GetArray() { ... }

ありがとう。

4

3 に答える 3

15

はい、これは落とし穴です!

ベクトルと 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 ベースにできない場合は、申し訳ありません: ではなく を使用する必要がありますArrayint[]

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[*]
于 2012-08-22T19:27:03.383 に答える
3

検証する実際のコードが見つかりませんが、その構文を試してみると、基数がゼロでない 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[,]"
于 2012-08-22T19:26:21.590 に答える
2

必要なのは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
于 2012-08-22T19:27:35.650 に答える