私はいくつかのイベントやインタフェースを実装するサンプルクラスを定義する内部インターフェイスがあります。クラスの内部イベントが内部インターフェイスのイベントを実装できないのはなぜですか?
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.
ここで何が起こっているの?内部インターフェイスなので、なぜイベントが公開されなければならないのか分かりません。
あなたが 'MyEvent'を呼び出す方法はスレッドセーフではありません。防御的なコピーを作成するか、あなたのイベントを 'delegate {}'に初期化する必要があります。これはもう 'null'について心配する必要がないという利点があります。 – svick
@svick:プログラムがマルチスレッドであるという証拠はありますか?マルチスレッド化されていないプログラムをスレッドセーフにすることは、貴重な時間を無駄にすることです。 –
@Eric、AFAIK、私たちはしません。一般的に、私はあなたに同意しますが、修正がこれほど簡単なときは、それを行う価値があると思います。特に、 'delegate {}'の解決法は呼び出しコードをより簡単にするからです。 – svick