与接口的协方差-接口的枚举

本文关键字:接口 枚举 方差 | 更新日期: 2023-09-27 18:27:34

我有一个这样的类:

public partial class GmxGlobalList : DynamicBindingListBase<GmxGlobal> 

其中DynamicBindingListBase实现从IEnumerable<T>扩展而来的Collection<T>——在本例中为IEnumerable<GmxGlobal>

GmxGlobal的定义类似

public partial class GmxGlobal : IGmxGlobal 

我现在想像一样申报GmxGlobalList

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

但这不起作用,因为我应该声明方法IEnumerator<IGmxGlobal> GetEnumerator()——但这已经从Collection<T>实现了——但不是用IGmxGlobal实现的,而是用GmxGlobal实现的。我想问你,为什么我必须实施IEnumerator<IGmxGlobal> GetEnumerator()?-我可以声明,GmxGlobalList是IGmxGlobalIEnumerableICollectionIList(或者可以枚举IGmxGlobal的其他东西)。

与接口的协方差-接口的枚举

由于DynamicBindingListBase<T>实现了IEnumerable<T>,而GmxGlobalList继承了DynamicBindingListBase<GmxGlobal>并实现了IEnumerable<IGmxGlobal>
CCD_ 22实现了CCD_ 23和CCD_。

我假设DynamicBindingListBase<T>已经有了IEnumerable<T>的具体实现。由于IEnumerable<IGmxGlobal>的作用域比IEnumerable<GmxGlobal>的作用域更广,因此此实现不能作为IEnumerable<IGmxGlobal>工作。

如果你只有以下内容:

GmxGlobalList : DynamicBindingListBase<GmxGlobal>

由于IEnumerable是共变体,您已经可以将GmxGlobalList用作IEnumerable<IGmxGlobal>。像这样:

IEnumerable<IGmxGlobal> foo = new GmxGlobalList();

如果您真的需要实现IEnumerable<IGmxGlobal>,您可以编写实现细节来包装DynamicBindingListBase<GmxGlobal>

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

这行得通吗?

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