21

パラメータを ICollection として宣言し、オブジェクトを List としてインスタンス化すると、インデックスを取得できないのはなぜですか? すなわち

ICollection<ProductDTO> Products = new List<ProductDTO>();
Products.Add(new ProductDTO(1,"Pen"));
Products.Add(new ProductDTO(2,"Notebook"));

次に、これは機能しません。

ProductDTO product = (ProductDTO)Products[0];

私が見逃しているビットは何ですか?
[はい、List を宣言として使用でき、機能しますが、次のようにリストとして宣言したくありません。

List<ProductDTO> Products = new List<ProductDTO>();

]

4

7 に答える 7

38

LINQ を使用すると、次のことができます。

ProductDTO product = (ProductDTO)Products.ElementAt(0);
于 2012-04-23T22:50:52.987 に答える
29

ICollectionインターフェイスはインデクサー宣言しないため、インデックス作成を使用して、その型の参照を通じて要素をフェッチすることはできません。

おそらくIListを試すことができます。これは、抽象的でありながら、さらに機能を追加します。もちろん、これは他の設計上の決定に影響を与える可能性があるため、慎重に検討します。

于 2009-12-09T17:59:39.577 に答える
7

ICollection はインデクサーを定義しません。

ICollection 非ジェネリック

ICollection ジェネリック

于 2009-12-09T17:58:55.983 に答える
5

次に、これは機能します:

ProductDTO product = ((IList<ProductDTO>)Products)[0];

その理由は、コンパイラが左辺値、つまり'='の左側にある変数を評価して、コンパイル時にアクセスできることがわかっているメソッドとプロパティを見つけるためです。これは静的型付けと呼ばれ、メンバーが常に到達可能であることを静的に認識することにより、実行時にオブジェクトメンバーに直接アクセスできるようにします。

于 2009-12-09T18:24:05.130 に答える
3

基本的な問題は、ICollectionがインデックスを定義しないことです。リストの場合、これはIListの実装によって行われます。

これを試して:

IList<ProductDTO> Products = new List<ProductDTO>(); 

または、インデックスで要素にアクセスする必要がある場合は、ICollectionを引き続き使用して、配列に変換できます。

ICollection<ProductDTO> Products = new List<ProductDTO>();        
ProductDTO z = Products.ToArray()[0];
于 2009-12-09T18:07:54.210 に答える