7

インターフェイスとジェネリックの実装について学んでいます。このコードを作成しましたが、VStudio は System.Collections.Enumerable.GetEnumerator() を実装していないと言っています。一般的に、以下でこれを行いませんでしたか?2つの実装が必要ですか?

namespace Generic_cars
{
 class VehicleLot:IEnumerable<Vehicle>
 {
    public List<Vehicle> Lot = new List<Vehicle>();

    IEnumerator<Vehicle> IEnumerable<Vehicle>.GetEnumerator()
    {
        foreach (Vehicle v in Lot) { yield return v; };
    }
 }
}
4

3 に答える 3

7

IEnumerable<Vehicle>オブジェクトを保持するために厳密に型指定された汎用インターフェイスである を実装していVehicleます。IEnumerableただし、そのインターフェイスは、ジェネリックではない古いインターフェイスから派生し、objectオブジェクトを保持するように型付けされています。

ジェネリック バージョンを実装する場合 (実際に行っています)、非ジェネリック バージョンも実装する必要があります。GetEnumerator通常、ジェネリック バージョンを呼び出すだけで非ジェネリック バージョンを実装します。

また、あなたはおそらく自分のやり方を明示的に実装したくないでしょう。GetEnumerator<Vehicle>オブジェクトを使用するには、オブジェクトを明示的にキャストする必要がありますIEnumerable<Vehicle>。代わりに、おそらくこれを行う必要があります。

public IEnumerator<Vehicle> GetEnumerator() {
    foreach( Vehicle item in items ) {
        yield return item;
    }
}

IEnumerator IEnumerable.GetEnumerator() {
    return GetEnumerator();
}
于 2012-10-15T02:35:09.943 に答える
1

そうすれば、あなたの人生はすべてうまくいくでしょう。

class VehicleLot : List<Vehicle>
{

}

これで、 VehicleLotがコレクション クラスになります。他のコレクションに対して行うのと同じように、任意の操作を行うことができます。

使用法:

VehicleLot list = new VehicleLot();
list.Add(new Vehicle()); // you can add as many Vehicles as you want
于 2012-10-15T02:33:53.467 に答える
1

通常、クラスが IEnumerable 自体を実装していない場合に適しています。プロパティを作成して、リストを IEnumerable として返すことができます。

namespace Generic_cars
{
 class VehicleLot
 {
    public List<Vehicle> Lot = new List<Vehicle>();

    IEnumerable<Vehicle> Vehicles
    {
        return Lot;
    }
 }
}
于 2012-10-15T02:44:10.093 に答える