C# 如何使用原始类型的子类型重新定义事件的参数类型并引用原始事件

C# 如何使用原始类型的子类型重新定义事件的参数类型并引用原始事件,c#,events,inheritance,C#,Events,Inheritance,本质上,我有一个接口IACollection,它定义了一个在参数IAItem中接受的事件,然后是从IACollection继承的另一个接口IBCollection,它将此事件重新定义为在从IAItem继承的IBItem中接受 我的问题是,当我试图创建一个实现接口IBCollection的类时,我似乎无法以一种只有一个实际事件的方式实现两个事件——这是因为接收IAItem的事件应该能够接收IBItem,因为它是IAItem 下面是我两次尝试的解决方案,但都因不同的原因而失败。有什么方法可以达到我想

本质上,我有一个接口IACollection,它定义了一个在参数IAItem中接受的事件,然后是从IACollection继承的另一个接口IBCollection,它将此事件重新定义为在从IAItem继承的IBItem中接受

我的问题是,当我试图创建一个实现接口IBCollection的类时,我似乎无法以一种只有一个实际事件的方式实现两个事件——这是因为接收IAItem的事件应该能够接收IBItem,因为它是IAItem

下面是我两次尝试的解决方案,但都因不同的原因而失败。有什么方法可以达到我想要达到的目标吗

using System;

public interface IAItem { }

public interface IBItem : IAItem { }

public interface IACollection
{
    event Action<IAItem> ItemAdded;
}

public interface IBCollection : IACollection
{
    new event Action<IBItem> ItemAdded;
}

public class Collection1 : IBCollection
{
    public event Action<IBItem> ItemAdded;

    // Won't work because the -= won't remove the same
    // lambda expression that was added before.
    event Action<IAItem> IACollection.ItemAdded
    {
        add { ItemAdded += (arg) => value(arg); }
        remove { ItemAdded -= (arg) => value(arg); }    // Won't remove
    }
}

public class Collection2 : IBCollection
{
    // Won't work in practice because Action<IB> cannot be
    // converted to Action<IA>, even though it should
    // theoretically work since IB can be converted to IA.
    public event Action<IBItem> ItemAdded
    {
        add { itemAdded += value; }     // Compile Error
        remove { itemAdded -= value; }      // Compile Error
    }

    event Action<IAItem> IACollection.ItemAdded
    {
        add { itemAdded += value; }
        remove { itemAdded -= value; }
    }

    private event Action<IAItem> itemAdded;
}
使用系统;
公共接口项{}
公共接口IBItem:IAItem{}
公共接口iCollection
{
增加事件动作项;
}
公共接口IBCollection:IACollection
{
新增事件动作项;
}
公共类集合1:IBCollection
{
增加公共事件行动项目;
//无法工作,因为-=无法删除相同的
//之前添加的lambda表达式。
事件操作IACollection.ItemAdded
{
添加{ItemAdded+=(arg)=>value(arg);}
删除{ItemAdded-=(arg)=>value(arg);}//不会删除
}
}
公共类集合2:IBCollection
{
//在实践中不起作用,因为行动是不可能的
//转化为行动,即使它应该
//从理论上讲,IB可以转换为IA。
已添加公共事件操作项
{
添加{itemAdded+=value;}//编译错误
删除{itemAdded-=value;}//编译错误
}
事件操作IACollection.ItemAdded
{
添加{itemAdded+=value;}
删除{itemAdded-=value;}
}
增加私人事件行动项目;
}