c# - 委托(delegate)中的协方差,有什么例子吗?

标签 c# .net delegates covariance contravariance

我正在阅读 this msdn article ,逆变示例(键盘和鼠标事件)很好用,而协变示例(哺乳动物和狗)看起来不是这样。

键盘和鼠标事件很棒,因为您可以在多种情况下使用 1 个处理程序;但是我想不出将返回更多派生类型的处理程序分配给返回基类型的处理程序有什么好处,更不用说拥有一个关心返回类型的委托(delegate)看起来不太常见?

有人可以提供一个更实际的委托(delegate)协变示例吗?

最佳答案

这是我实现服务定位器的“真实世界”示例。我想创建一个类,我可以在其中注册知道如何生成某种类型实例的“工厂”委托(delegate),然后稍后再解析某种类型的实例。这是它的样子:

interface ISomeService { ... }
class SomeService : ISomeService { ... }

class IocContainer
{
    private readonly Dictionary<Type, Func<object>> _factories = new Dictionary<Type, Func<object>>();

    public void Register<T>(Func<T> factory)
        where T: class 
    {
        _factories[typeof(T)] = factory;
    }

    // Note: this is C#6, refactor if not using VS2015
    public T Resolve<T>() => (T)_factories[typeof(T)]();
}

class Program
{
    static void Main(string[] args)
    {
        var container = new IocContainer();
        container.Register<ISomeService>(() => new SomeService());

        // ...

        var service = container.Resolve<ISomeService>();
    }
}

现在,我在做什么container.Register<ISomeService>(() => new SomeService()) , Func 的协方差委托(delegate)在两个层面上发挥作用:

  1. 我可以传入 Func<SomeService>并且它是可分配的,其中 Func<ISomeService>预计没有问题,因为 SomeServiceISomeService
  2. Register 内方法,一个Func<T>可以分配一个 Func<object>预计没有问题,因为任何引用类型都是 object

如果 Func<SomeService>无法分配给 Func<ISomeService> , 或 Func<ISomeService>无法分配给 Func<object> (通过协方差),这个例子行不通。

关于c# - 委托(delegate)中的协方差,有什么例子吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31873464/

相关文章:

c# - Excel 2007 中的数值 - 底层 xml 文件中的表示与存储

c# - 将 LINQ Select 中的递归方法组转换为迭代方法

c# - 正在构建的项目 "MSIL"的处理器架构与引用“AMD64”的处理器架构不匹配

ios - 为什么我的委托(delegate)仅在定义为 VC 而不是外部类时才起作用?

ios - Controller 之间通过自定义委托(delegate)进行通信

c# - 如何从另一个日期时间中减去一个日期时间?

c# - 如何用具有相同主键的本地数据库表更新远程表?

c# - 我们什么时候应该使用 public 什么时候使用 private?

c# - .NET 中的数字分组

ios - 使用协议(protocol)扩展类 VS 在类内部实现协议(protocol)