2011-07-05 53 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中做到這一點。

相關問題