2011-07-05 30 views
3

私はいくつかのイベントやインタフェースを実装するサンプルクラスを定義する内部インターフェイスがあります。クラスの内部イベントが内部インターフェイスのイベントを実装できないのはなぜですか?

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

あなたが 'MyEvent'を呼び出す方法はスレッドセーフではありません。防御的なコピーを作成するか、あなたのイベントを 'delegate {}'に初期化する必要があります。これはもう 'null'について心配する必要がないという利点があります。 – svick

+1

@svick:プログラムがマルチスレッドであるという証拠はありますか?マルチスレッド化されていないプログラムをスレッドセーフにすることは、貴重な時間を無駄にすることです。 –

+0

@Eric、AFAIK、私たちはしません。一般的に、私はあなたに同意しますが、修正がこれほど簡単なときは、それを行う価値があると思います。特に、 'delegate {}'の解決法は呼び出しコードをより簡単にするからです。 – svick

答えて

4

IMyEventsを明示的に実装する必要があります。インタフェースを実装

public class MyClass : IMyEvents 
{ 
    // ... 

    event EventHandler IMyEvents.MyEvent 
    { 
     add { MyEvent += value; } 
     remove { MyEvent -= value; } 
    } 
} 
9

メンバーは関係なく、インターフェースのアクセシビリティの、C#で公共又は明示いずれかであることが要求されます。

これは「簡略化」ルールです。そうでなければ、C++のアクセシビリティであるパッシブな継承やプライベートな継承などの泥沼に入ります。 またはのいずれかを明示的に使用して、インターフェイスを実装していることを明示してください。

1

実装メンバーがパブリックであるか、明示的な実装であると主張しているため、C#では許可されていません(この場合、プライベートになりますが、インターフェイスへの参照を通じてアクセスできます) 。あなたはVB.NETでそれを行うことができます。

関連する問題