我有一个定义一些事件的内部接口和一个实现接口的示例类:
internal interface IMyEvents
{
event EventHandler MyEvent;
}
public class MyClass : IMyEvents
{
internal event EventHandler MyEvent;
public void DoSomething()
{
if (MyEvent != null) MyEvent(this, new EventArgs());
}
}
当我尝试编译时,出现以下错误:
error CS0737: 'MyClass' does not implement interface member '.IMyEvents.MyEvent'. 'MyClass.MyEvent' cannot implement an interface member because it is not public.
这里发生了什么?这是一个内部界面,所以我不明白为什么必须公开这个事件。
答案 0 :(得分:9)
无论接口的可访问性如何,实现接口的成员都必须在C#中公开或显式。
这是一个“简化”规则;如果你不这样做,那么你会陷入C ++可访问性的泥潭,那里有公共继承,私有继承等等。我们宁愿保持简单:如果您想实现一个界面,成为公共成员,或明确表示您正在实施界面。
答案 1 :(得分:4)
您需要明确实施IMyEvents
。
public class MyClass : IMyEvents
{
// ...
event EventHandler IMyEvents.MyEvent
{
add { MyEvent += value; }
remove { MyEvent -= value; }
}
}
答案 2 :(得分:1)
C#不允许这样做,因为它坚持要求实现成员是公共的或者它是一个显式实现(在这种情况下,它最终将是私有的,但您仍然可以通过对该接口的引用来访问它)。你可以在VB.NET中做到这一点。