sel*_*ary 47 c# events dynamic
这编译:
public interface IMyInterface
{
event Action<dynamic> OnSomeEvent;
}
class MyInterface : IMyInterface
{
public event Action<dynamic> OnSomeEvent;
}
Run Code Online (Sandbox Code Playgroud)
但是当我将界面和实现分离到不同的项目时,我得到:
Accessor'TestProject2.MyInterface.OnSomeEvent.remove'无法为类型'TestProject2.MyInterface'实现接口成员'InterfaceNamespace.IMyInterface.remove_OnSomeEvent(System.Action)'.使用显式接口实现.
只有动态参数才会出现这种情况......
Jon*_*eet 30
接得好.这看起来可能是C#编译器中的一个错误 - 我会ping Eric Lippert看看他的想法.(dynamic
可能有点棘手;这个错误可能是一个非常好但非明显的原因.)
编辑:下面的代码将出现不以毕竟工作.我可以发誓我今天早上工作了......我对发生的事情感到非常困惑.根据Simon的评论,代码失败并显示一条消息,说该语言不支持.
需要注意的是,如果你做使用显式接口实现,它似乎编译就好了:
// Doesn't actually compile - see edit above
class MyInterface : IMyInterface
{
private Action<dynamic> foo;
event Action<dynamic> IMyInterface.OnSomeEvent
{
// TODO (potentially): thread safety
add { foo += value; }
remove { foo -= value; }
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:这个答案的其余部分仍然是......
请注意,您不能将类似字段的事件指定为显式实现的事件,即这不起作用:
event Action<dynamic> IMyInterface.OnSomeEvent;
Run Code Online (Sandbox Code Playgroud)
它给出以下错误消息:
Test.cs(15,39):错误CS0071:事件的显式接口实现必须使用事件访问器语法
如果您只是尝试更改为事件访问器语法,则会得到与原始代码相同的错误.
请注意,将事件更改为属性可以使用自动实现的属性实现.
感谢您发布此问题,并感谢Jon以我的方式发送它.我把它放在我们的一位专门研究"动态"的测试人员的调查队列中.我们将看看我们是否能够弄清楚这里发生了什么.它当然闻起来像一个臭虫.
将来,请考虑在connect.microsoft.com上发布这样的内容; 这使得测试人员的速度更快,并为我们提供了更好的机制来获取有关该问题的更多信息.