Search code examples
c#eventsinterfaceexplicit-implementation

C# Language Design: explicit interface implementation of an event


Small question about C# language design :))

If I had an interface like this:

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

It's possible to explicitly implement such interface using C# 3.0 auto-implemented properties:

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

But if I had an event in the interface:

interface IFoo {
  event EventHandler Event;
}

And trying to explicitly implement it using field-like event:

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

I will get the following compiler error:

error CS0071: An explicit interface implementation of an event must use event accessor syntax

I think that field-like events is the some kind of dualism for auto-implemented properties.

So my question is: what is the design reason for such restriction done?


Solution

  • I guess it might have to do with the fact that you can't call an explicit interface implementation from other members of the class:

    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() { }
    }
    

    Note that you can call the method by upcasting to the interface first:((I)this).DoIt();. A bit ugly but it works.

    If events could be explicitly implemented as ControlFlow (the OP) suggested, then how would you actually raise them? Consider:

    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;
    }
    

    Here you cannot even raise the event by upcasting to the interface first, because events can only be raised from within the implementing class. It therefore seems to make perfect sense to require accessor syntax for explicitly implemented events.