c# - IEnumerable<T> 等于 ICollection<T> 类型检查

标签 c# generics contravariance

我为我们的应用程序编写了一个小型的发布/子系统,

您通过实现 IHandle 订阅消息

假设订阅者实现 IHandle<IEnumerable<MyType>>

然后有人发布了一条类型为 ICollection<MyType>> 的消息这当然应该触发订阅者,因为 ICollection<> 的类型为 IEnumerable<>

但我的代码不支持这一点,解决方法是发布者将 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> 的所有类型 有什么想法吗?

最佳答案

您需要将 IHandle 定义为逆变,这样您就不需要解决:

interface IHandle<in T>

这样它将接受所有继承自 IEnumerable 的类型

这个link为您详细解释了协方差和逆变如何与 genric 配合使用

关于c# - IEnumerable<T> 等于 ICollection<T> 类型检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12528577/

相关文章:

c# - 如何在 itextsharp pdf 创建中设置单元格宽度

c# - IIS 服务器和 ASP.Net Core - 500.19,httpplatformhandler 标签上的错误代码为 0x8007000d

c# - MONO 的多门户 CMS

c# - 为什么 ReSharper 建议我使类型参数 T 逆变?

c# - 为什么 "Covariance"和 "Contravariance"的概念在实现接口(interface)的方法时适用?

c# - 如果没有处理程序,Azure IoT 中心直接方法调用会发生什么情况

.net - 插入到通用字典中可能存在重复键吗?

泛型函数内部的 Swift Equatable 泛型类型比较

c# - 使用不带参数的 "params"关键字使用反射调用方法

Rust 函数指针逆变