2012-08-22 6 views
10

を入力するために、私は非ゼロの下作成するには、返されるの種類C#の:Array.CreateInstance:型のオブジェクトをキャストすることができません[*] []

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

を呼び出すことにより、C#での1次元配列をバインド配列はint []ではなくint [*]です。誰がこれが何を意味するのか詳しく説明できますか?この配列を呼び出し元に返すことができるようにしたいとします。たとえば、

int[] GetArray() { ... } 

ありがとうございました。

+0

あなたが見ている 'int型[*] '?私がそのコードを実行すると、 'int'の配列が得られます。 –

+0

D Stanley、Array.CreateInstance(typeof(int)、新しいint [] {6}、新しいint [] {6})。GetType()。FullName –

+1

あなたが 'new int [長さ] '?これは短く、人々が使用する標準的なシンタックスです。 – Servy

答えて

12

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

ベクターと1次元配列の間に違いがあります。 int[]ベクターです。ベクトル(int[]のような)でなければなりません。それ以外の場合は、Arrayと呼びます。あなたがArrayを使用する必要があり、ない:あなたの配列は0から始まることができない場合は、申し訳ありません

int[] arr2 = (int[]) Array.CreateInstance(typeof (int), 
     new int[] {length}, new int[] {0}); 

// and yes, this is doing it the hard way, to show a point... 
int[] arr1 = (int[]) Array.CreateInstance(typeof(int), length); 

か(これはまだゼロベースであることに注意):たとえば、 int[]

012:

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

それがさらに混乱させるには、違いがあります

2

実際のコードを確認することはできませんが、その構文を実験すると、非ゼロの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[,]" 
2

あなたが必要とするすべては、一次元配列がある場合、これはトリックを行う必要がありますよりも、

Array.CreateInstance(typeof(int), length) 

あなたは下界、その後、戻ってタイプを指定した場合であれば全く異なる

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 
関連する問題