我有一个通用接口,如下所示:
public interface IObjectProvider<out T>
{
event Action<T> ValueOccured;
}
现在我想创建一个类,它实现了这个接口两次:
public class GlobalReceiver : IObjectProvider<Foo>, IObjectProvider<Bar>
{
public event Action<Foo> IObjectProvider<Foo>.ValueOccured;
public event Action<Bar> IObjectProvider<Bar>.ValueOccured;
}
并且无法使其正常工作,因为对于这个编译器说我需要使用正确的语法,如果我进行非显式实现,我(如预期的那样)会出错:
会员已经宣布。
我怎样才能找出这个问题?
答案 0 :(得分:7)
您必须明确告诉如何在事件上实现add
和remove
,因为它是一个显式的接口实现:
public class GlobalReceiver : IObjectProvider<Foo>, IObjectProvider<Bar>
{
private event Action<Foo> ActionFoo;
event Action<Foo> IObjectProvider<Foo>.ValueOccured { add { ActionFoo += value; } remove { ActionFoo -= value; } }
private event Action<Bar> ActionBar;
event Action<Bar> IObjectProvider<Bar>.ValueOccured { add { ActionBar += value; } remove { ActionBar -= value; } }
}
我添加了一个默认实现,您可以将其用于实际事件,以便从您的类中访问它们。
为什么呢?可能是因为你不能只从类中的成员名称调用事件,所以调用事件处理程序将非常困难。
答案 1 :(得分:2)
显式接口实现无法公开。删除public
访问者。
另外,如How to: Implement Interface Events (C# Programming Guide)中所述:
为事件编写显式接口实现时,还必须编写添加和删除事件访问器。