這個答案是對這個有趣的問題進行精心設計。不是一個真正的答案,但是對整個討論的貢獻是對於正常評論來說太小。
我查了幾件事情,這個接口:
namespace DifferentAssemblyNamespace
{
public interface IBar
{
event Action<dynamic> OnSomeEvent;
}
}
及其實施:
// implicit interface implementation
// generates compile error "Explicit interface implementation"
public class Foo1 : IBar
{
private Action<dynamic> foo;
public event Action<dynamic> OnSomeEvent
{
add { foo += value; }
remove { foo -= value; }
}
}
// implicit interface implementation
// generates compile error "Not supported by the language"
public class Foo2 : IBar
{
private Action<dynamic> foo;
event Action<dynamic> IBar.OnSomeEvent
{
add { foo += value; }
remove { foo -= value; }
}
}
行不通,似乎是一個規則不包括其他必要的規則。
但..如果我們調用仿製藥的幫助,並使用類型參數,而不是直接使用dynamic
,如:
namespace DifferentAssemblyNamespace
{
public interface IGenericBar<T>
{
event Action<T> OnSomeEvent;
}
}
及其實施。
// implicit interface implementation
public class Foo3<T> : IGenericBar<T>
{
private Action<T> foo;
event Action<T> IGenericBar<T>.OnSomeEvent
{
add { foo += value; }
remove { foo -= value; }
}
}
由於某種原因,我們可以建立(因爲它應該)並運行:
/** does build **/
IGenericBar<dynamic> f = new Foo3<dynamic>();
f.OnSomeEvent += new Action<dynamic>(f_OnSomeEvent);
看來,類型參數做一些額外的編譯器很滿意。
我不確定發生了什麼,所以我想知道。
假設,高度假設(也許是廢話)
,但目前我把我的兩分錢的 類型的比較,必須有 通過加發/刪除訪問者在 的鏈表持有該事件的目標/方法 。
我敢打賭 編譯器跌倒在 問題,它不能保證什麼 動態的外部組件,從而不能確定一個元素是否已經在列表中或沒有,這是必要的添加或刪除(因此顯式接口實現)
我們都知道它是隻是一位 歸因的對象,但它似乎仍然 ,它需要一個額外的步驟,其中一些 強類型是有保證的,那就是 什麼T還,在編譯時。
/假設,假設高(也許是廢話)
不知編譯器怎麼會知道如何保護覆蓋,然後認識到如何處理動態做,當你從對方編譯項目分開。 – 2011-05-08 10:03:18
有沒有什麼配置讓顯式接口實現工作?我得到一個錯誤CS0682:'ConsoleApplication1.MyInterface.ClassLibrary1.IMyInterface.OnSomeEvent'無法實現'ClassLibrary1.IMyInterface。OnSomeEvent',因爲它不被編譯的語言錯誤支持。 – 2011-05-08 10:28:17
@Simon:你使用的是什麼版本的C#編譯器?動態是在C#4中引入的。 – 2011-05-08 12:27:11