2012-03-12 16 views
1

の列挙は、私はこのようなクラスを持っています。しかし、これはすでに実装されている -共分散界面

クラスGmxGlobalされるが、私は方法IEnumerator<IGmxGlobal> GetEnumerator()を宣言する必要がありますので、私は、GmxGlobalList

よう
public partial class GmxGlobalList : DynamicBindingListBase<GmxGlobal>, IEnumerable<IGmxGlobal> 

を宣言する。しかし、これは動作しません。今すぐ欲しい

public partial class GmxGlobal : IGmxGlobal 

のように定義しますCollection<T>からですが、IGmxGlobalではなく、GmxGlobalとなります。私はあなたに尋ねるでしょう、なぜ私はIEnumerator<IGmxGlobal> GetEnumerator()を実装する必要がありますか? - GmxGlobalListがIEnumerableまたはICollectionまたはIListIGmxGlobal(またはその他IGmxGlobalが列挙できるもの)であることを宣言することができますか?

+0

ベースのようなDynamicBindingListBase を持つ十分ではないですか?なぜIEnumerableが必要なのですか? – Tigran

+0

GmxGlobalListはIEnumerable を定義します。 IGmxGlobalListインターフェイスも実装しています。今、IGmxGlobalList(IGmxGlobalListとしても知られています)のオブジェクトを使用し、GmmGlobalではなくIGmxGlobalだけを列挙する必要があるため、IEnumerable を実装するために、このインターフェイス(IGmxGlobalList)を定義します。このために、IGmxGlobalList:IEnumerable を宣言する必要があります。 – BennoDual

答えて

1
IEnumerable<IGmxGlobal> e = (IEnumerable<GmxGlobal>)instanceOfGmxGlobalList; 

DynamicBindingListBase<T>DynamicBindingListBase<GmxGlobal>からIEnumerable<T>GmxGlobalList継承を実装し、IEnumerable<IGmxGlobal>を実装しているので。
GmxGlobalListは、IEnumerable<GmxGlobal>IEnumerable<IGmxGlobal>の両方を実装しています。

DynamicBindingListBase<T>にはすでに具体的な実装がIEnumerable<T>であると仮定します。 IEnumerable<IGmxGlobal>の範囲がIEnumerable<GmxGlobal>より広いため、この実装はIEnumerable<IGmxGlobal>として機能しません。

あなただけの次を持っているとしたら:

GmxGlobalList : DynamicBindingListBase<GmxGlobal> 

によりIEnumerableに共同バリアントであることは、すでにIEnumerable<IGmxGlobal>としてGmxGlobalListを使用することができます。このように:

IEnumerable<IGmxGlobal> foo = new GmxGlobalList(); 

あなたは本当にあなたがDynamicBindingListBase<GmxGlobal>を包み込むように実装の詳細を書くことができますIEnumerable<IGmxGlobal>実装する必要がある場合。

public IEnumerator<IGmxGlobal> GetEnumerator() 
{ 
    return (base as IEnumerator<GmxGlobal>).GetEnumerator(); 
} 

IEnumerator IEnumerable.GetEnumerator() 
{ 
    return GetEnumerator(); 
} 
0

これは機能しますか?