C#语言设计:事件的显式接口实现

关于C#语言设计的小问题:))

如果我有一个这样的接口:

interface IFoo {
  int Value { get; set; }
}

可以使用C#3.0自动实现的属性显式实现这样的接口:

sealed class Foo : IFoo {
  int IFoo.Value { get; set; }
}

但是如果我在界面中有一个事件:

interface IFoo {
  event EventHandler Event;
}

并尝试使用字段事件显式实现它:

sealed class Foo : IFoo {
  event EventHandler IFoo.Event;
}

我会得到以下编译器错误:

错误CS0071:事件的显式接口实现必须使用事件访问器语法

我认为田间事件是自动执行属性的某种二元论。

所以我的问题是:这种限制的设计原因是什么?

我想这可能与事实,你不能调用显式接口实现从类的其他成员:

public interface I
{
    void DoIt();
}

public class C : I
{
    public C()
    {
        DoIt(); // error CS0103: The name 'DoIt' does not exist in the current context
    }

    void I.DoIt() { }
}

注意,你可以通过向上转换到接口来调用该方法:((I)this).DoIt();.有点丑,但它的工作原理。

如果事件可以显式实现为ControlFlow(OP)建议,那么你实际上如何提出它们?考虑:

public interface I
{
    event EventHandler SomethingHappened;
}

public class C : I
{
    public void OnSomethingHappened()
    {
        // Same problem as above
        SomethingHappened(this, EventArgs.Empty);
    }

    event EventHandler I.SomethingHappened;
}

在这里你甚至不能通过向上转换到接口首先提高事件,因为事件只能从实现类中提出。因此,似乎要求明确实现的事件需要访问器语法。

http://stackoverflow.com/questions/2268065/c-sharp-language-design-explicit-interface-implementation-of-an-event

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:C#语言设计:事件的显式接口实现