为什么类中的内部事件不能在内部接口上实现事件?

时间:2011-07-05 14:12:41

标签: c#

我有一个定义一些事件的内部接口和一个实现接口的示例类:

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.

这里发生了什么?这是一个内部界面,所以我不明白为什么必须公开这个事件。

3 个答案:

答案 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中做到这一点。