IEnumerable <t>等于ICollection <t>类型检查</t> </t>

时间:2012-09-21 10:15:43

标签: c# generics contravariance

我为我们的应用编写了一个小型的pub / sub系统,

您通过实施IHandle

订阅消息

让我们说订阅者实现了IHandle<IEnumerable<MyType>>

然后有人发布了ICollection<MyType>>类型的消息,因为IColletion&lt;&gt;属于IEnumerable类型&lt;&gt;

但我的代码不支持这个,一个解决方法是发布者将ICollection转换为IEnumerable,但它容易在更大的团队中出错。

这是无效的代码

public void Publish<T>(T message) where T : class
{
    if (config.EnableEventAggregator)
        subscribers.OfType<IHandle<T>>()
        .ForEach(s => s.Handle(message));
}

我希望它为所有继承IHandle<IEnumerable>的类型找到IEnumerable<T> 有什么想法吗?

1 个答案:

答案 0 :(得分:3)

您需要将IHandle定义为 contra-variant ,以便您无需解决此问题:

interface IHandle<in T>

通过这种方式,它将接受从IEnumerable继承的所有类型

link详细解释了协方差和反方差如何与genric一起使用