当接口和具体在不同的项目中时,"无法实现接口成员"错误

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:事件的显式接口实现必须使用事件访问器语法

如果您只是尝试更改为事件访问器语法,则会得到与原始代码相同的错误.

请注意,将事件更改为属性可以使用自动实现的属性实现.


Eri*_*ert 9

感谢您发布此问题,并感谢Jon以我的方式发送它.我把它放在我们的一位专门研究"动态"的测试人员的调查队列中.我们将看看我们是否能够弄清楚这里发生了什么.它当然闻起来像一个臭虫.

将来,请考虑在connect.microsoft.com上发布这样的内容; 这使得测试人员的速度更快,并为我们提供了更好的机制来获取有关该问题的更多信息.