这个答案是要阐明您对这个有趣问题的想法。 这不是一个真正的答案,而是对整个讨论的贡献,对于正常的评论而言,这个贡献很小。
我检查了几件事,这个界面:
namespace DifferentAssemblyNamespace
{
public interface IBar
{
event Action OnSomeEvent;
}
}
及其实现:
// implicit interface implementation
// generates compile error "Explicit interface implementation"
public class Foo1 : IBar
{
private Action foo;
public event Action OnSomeEvent
{
add { foo += value; }
remove { foo -= value; }
}
}
// implicit interface implementation
// generates compile error "Not supported by the language"
public class Foo2 : IBar
{
private Action foo;
event Action IBar.OnSomeEvent
{
add { foo += value; }
remove { foo -= value; }
}
}
永远不会起作用,似乎一个规则正在排除另一条必要规则。
但是..如果我们调用泛型来寻求帮助,并使用Type参数而不是直接使用dynamic,例如:
namespace DifferentAssemblyNamespace
{
public interface IGenericBar
{
event Action OnSomeEvent;
}
}
及其实现。
// implicit interface implementation
public class Foo3 : IGenericBar
{
private Action foo;
event Action IGenericBar.OnSomeEvent
{
add { foo += value; }
remove { foo -= value; }
}
}
由于某些原因,我们可以构建(应该运行)并运行:
/** does build **/
IGenericBar f = new Foo3();
f.OnSomeEvent += new Action(f_OnSomeEvent);
似乎Type Parameter做了一些编译器满意的事情。
我不确定发生了什么,所以我也想知道。
假设,高度假设(也许废话)
但目前我把两分钱放在 必须有类型的比较 通过添加/删除访问器在 包含 事件的目标/方法。
我打赌 编译器跌倒了 无法保证什么的问题 动态变量位于外部程序集中,因此无法确定列表中是否已存在某个元素,这是添加或删除它们所必需的。(因此,实现显式接口)
我们都知道这只是一个 归因于对象,但看起来 它需要一个额外的步骤,其中一些 强类型是有保证的,那就是 T在编译时的作用。
/假设,高度假设(可能是胡扯)