了解方差逆变

问题描述

我正在尝试了解方差的工作原理。我创建了一个 IRegistry 接口,它支持一个逆变器 TDomainEvent一个逆变器 TDomainContraVariant。问题是 TDomainEvent 扩展了 IDomainEvent,而 TDomainContraVariant 扩展了 IDomainEventHandler<TDomainEvent>

出于某种原因,我收到错误消息,指出无法将 TDomainContraVariant 转换为 IDomainEventHandler<IDomainEvent>,这应该可以作为 TDomainEvent 扩展 IDomainEvent。>

using System;
using System.Collections.Generic;

public interface IDomainEvent {}
public class ProductSetCreatedEvent : IDomainEvent {}
public class VersionCreatedEvent : IDomainEvent {}

public class ProductSetCreatedEventHandler : IDomainEventHandler<ProductSetCreatedEvent> {}
public class VersionCreatedEventHandler : IDomainEventHandler<VersionCreatedEvent> {}

public interface IDomainEventHandler<in TDomainEvent> where TDomainEvent : IDomainEvent {}


public interface IRegistry<in TDomainEvent,in TDomainContraVariant>
    where TDomainEvent : IDomainEvent
    where TDomainContraVariant : IDomainEventHandler<TDomainEvent>
{
    void Add(TDomainContraVariant element);
}


public class Registry<TDomainEvent,TDomainContraVariant> : IRegistry<TDomainEvent,TDomainContraVariant>
    where TDomainEvent : IDomainEvent
    where TDomainContraVariant : IDomainEventHandler<TDomainEvent>
{
    private IList<IDomainEventHandler<IDomainEvent>> list;

    public Registry()
    {
        this.list = new List<IDomainEventHandler<IDomainEvent>>();
    }

    public void Add(TDomainContraVariant element)
    {
        this.list.Add(element);
    }
    
    public IList<IDomainEventHandler<IDomainEvent>> Get()
    {
        return this.list;
    }
}
                    
public class Program
{   
    private static Registry<IDomainEvent,IDomainEventHandler<IDomainEvent>> list = new Registry<IDomainEvent,IDomainEventHandler<IDomainEvent>>();
    
    public static void Main()
    {       
        IDomainEventHandler<ProductSetCreatedEvent> eventHandler = new ProductSetCreatedEventHandler();
        AddToRegistry<ProductSetCreatedEvent,IDomainEventHandler<ProductSetCreatedEvent>>(eventHandler);
    }
    
    public static void AddToRegistry<TDomainEvent,TDomainContraVariant>(TDomainContraVariant cesto)
        where TDomainEvent : IDomainEvent
        where TDomainContraVariant : IDomainEventHandler<TDomainEvent>
    {
        list.Add(cesto);
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)