2011-12-30 28 views
12

私はC#を学び、 "型指向"の側面を理解しようとしています。int []文字列または他の型のオブジェクトにsystem.arrayオブジェクトをキャスト

先日、メソッドからSystem.Arrayオブジェクトを受け取る必要がありました。 それから、私はそれを個々のオブジェクトで処理しようとしました。だから私はインデックスでそれを扱おうとしました。 コンパイラは、System.Arrayオブジェクトがインデックス作成をサポートしていないと言ってくれません。

しかし、そうではありません。配列はすべての配列の基本クラスです(System.Array on msdn)? int []はインデックス作成をどのようにサポートしていますか、Array []はサポートしていませんか?ここ

は、問題を示すためにいくつかのコードです:

int[] intArray = {1,2,3,4,5,6,7,8,9,10}; 
int t; 
Array sysArray;  
Console.WriteLine("{0}", intArray.GetType().ToString()); // output: System.Int32[] 
sysArray = Array.CreateInstance(typeof(int), 10); 
Console.WriteLine("{0}", sysArray.GetType().ToString()); // output: System.Int32[] 
sysArray = intArray; //compiles ok 
//t = sysArray[4]; This line produces error Error 2 Cannot apply indexing with [] to an 
// expression of type 'System.Array' 
//t = intArray[4]; This line compiles ok 

それでは、私たちがここに持っていることは同じタイプであるように見える2つのオブジェクト、です。 しかし、1つはインデックス作成を実装しており、もう1つはそうではありません、どうすれば可能ですか?


回答

への参照あなたのコメントを読んだ後、私は物事の感覚を得たと思います。 int []はオブジェクトの配列です。各オブジェクトはint32型の構造体です。 Array []はオブジェクトの配列です。各オブジェクトはArray型のクラスです。 意味:配列の配列。 私は次のコードで表示することができますよう:

Array[] sysArrayOfArray = new Array[SIZE_OF_THE_MOTHER_ARRAY]; 
sysArrayOfArray[0] = Array.CreateInstance(typeof(int),SIZE_OF_FIRST_CHILD_ARRAY); 
sysArrayOfArray[1] = Array.CreateInstance(typeof(int),SIZE_OF_FIRST_SECOND_ARRAY); 

というように、私はsysArrayの要素にアクセスしようとした方法が間違っていた理由は... はので、私は理解しました。 intArray - 多くのintの> 1つのアレイ sysArray - ビューsysArrayの言語の点から

(多くのint型へのアクセスを許可)> 1クラスは、(それが1つのオブジェクトへの参照のみで、まったく配列ではありません)タイプのSystem.Arrayの

(ビットを繰り返すため申し訳ありませんが、それは本当に私の頭の中でセットの事を助け

その違いを理解する上で案内するためにあなたのすべてに感謝します。 Arrayがそうのように宣言されている一方で

Array sysArray = Array.CreateInstance(typeof(int),3); 
int[] intArray = new int[3]; 
int one, ten, hundred; 
sysArray.SetValue(1, 0); 
sysArray.SetValue(10,1); 
sysArray.SetValue(100,2); 
intArray = (int[])sysArray;// works, but forces me to create a new reference 
one = ((int[])sysArray)[0];// works and is exactly what i was looking for... 
ten = ((int[])sysArray)[1]; 
hundred = ((int[])sysArray)[2];  
+0

あなたの質問は明らかではありません。 intはオブジェクトです....だからあなたがしていることはほとんど意味がありません。 –

答えて

11

キャストは違いの世話をします。

t = (sysArray as int[])[4]; 

あなたは、彼らがあるため、両方の配列は、タイプSystem.Int32[]であることを見ています(これがなぜこのキャストが機能するのか)。

int[] eventTypeIDs = eventTypes.Select(Convert.ToInt32).ToArray(); 
5

intBCL

public struct Int32 : IComparable, IFormattable, IConvertible, IComparable<Int32>, Equatable<Int32> 

structとして宣言されています。私は何を探していたし、最高の私のために働いたことはあることソリューションに関する

.. :

public abstract class Array : ICloneable, IList, IStructuralComparable, IStructuralEquatable 

実際には同じではありません。あなたはインデクサを使用して配列から項目を取得したいならば、私はあなたがこれを行う必要があるだろうと思い

int number = ((IList<int>)sysArray)[4]; 

理由は、インデクサメソッドは配列で宣言されている方法によるものである:

Object IList.this[int index] { 
    get { return GetValue(index); } 
    set { SetValue(value, index); } 
} 

IListが署名で宣言されているため、インデクサーにアクセスするにはsysArrayIList<int>にキャストする必要があります。代わりに、インデクサーは次のように宣言されていた場合:

Object this[int index] { 

[はい、あなたは何の問題もなくsysArray[0];を行うことができます。

+0

単一 'int'がインデックス化することができない理由はここでも、OPが求めていません。彼らは一般的な 'System.Array'オブジェクトをなぜ索引付けできないのかを尋ねています。 –

+0

'int []'を使用している場合は、実際にはC#言語構造、つまり配列を使用しています。つまり、インデックスアクセスのための組み込みのサポートがあります。 'myarray [23];'本質的に 'structs'(int)の配列にアクセスする' Array'クラスはそれ自身のオブジェクトなので、インデックスアクセスを使用するときはC#言語を使用していません。 indexerメソッドはそのクラス、つまり 'Object IList.this [int index]'にあります。簡単に言えば、各タイプのインデックスアクセサメソッドは全く異なります。 –

+0

私は配列が "C#言語構造"だとは思いません。配列要素の索引付けに角括弧を使用することは、言語構造です。配列の存在は、CLIの基本的な機能です。 ** ECMA-335:8.9.1アレイタイプ**を参照してください。 IListに関しては、これはインデクサー 'this [int index]'を(注記のとおり)含みます。では、System.Arrayは必須メンバー 'this [int index]'を実装せずにIListをどのように実装できますか? –

1

あなたは、各オブジェクトが実装するインタフェースを見ています。 ArrayIList実装を供給しないintながらオブジェクトインデクサを提供System.Collections.IListを実装します。

+1

これはOPが意味するものではありません。 OPは抽象System.Arrayクラスがインデクサー構文を使って要素へのアクセスを許可しない理由を尋ねています:それは爆弾である 'sysarray [4]'の式です。 –

1

のSystem.Arrayは、抽象基本クラスです。 Microsoftのドキュメントには、すべてが書かれています。

Provides methods for creating, manipulating, searching, and sorting arrays, thereby 
serving as the base class for all arrays in the common language runtime. 

System.Arrayはインデクサーの実装を提供していません。

何のために動作しますが、このです...

int[] sysArray = (int[])Array.CreateInstance(typeof(int), 10); 
1

仮定eventTypesは整数値(object[] eventTypes)を含むオブジェクトです。

array.GetValue(1); 
array.GetValue(1,2); 
0

あなたはGetValueメソッド関数を使用して配列の値を読むことができます:

関連する問題