2013-03-14 96 views
3

我想将c#代码转换为C++/cli。一切顺利,直到我开始将接口事件显式实现转换为C++/cli语法。C++ cli接口事件显式实现

让我们在C#中说,我有这个接口

public interface Interface 
{ 
    public event MyEventHandler Event; 
} 

这是在类实现中明确的方式,因此它不会与它的名称的另一个成员发生冲突:

public interface Class : Interface 
{ 
    event MyEventHandler Interface.Event; 

    public event AnotherEventHandler Event; 
} 

我试图将Class转换为C++/cli,如下所示:

public ref class Class : public Interface 
{ 
    virtual event MyEventHandler^ Event2 = Interface::Event 
    { 
    } 

    ... 
}; 

这将不会编译给我“... = Interface :: Event”部分的语法错误。有没有人知道什么是正确的语法,或者它甚至存在于C++/cli中?我花了一些时间在互联网上搜索,但没有遇到任何有用的东西。

UPDATE:下面是一个说明该问题的完整的C/CLI代码:

public delegate void MyEventHandle(); 
public delegate void AnotherEventHandle(); 

public interface class Interface 
{ 
    event MyEventHandler^ Event; 
}; 

public ref class Class : public Interface 
{ 
public: 
    virtual event MyEventHandler^ Event2 = Interface::Event 
    { 
     virtual void add(MyEventHandle^) {} 
     virtual void remove(MyEventHandle^) {} 
    } 

    event AnotherEventHandler^ Event; 
}; 

通过VC++ 2012输出误差为“错误C2146:语法错误:缺少 ';'前标识“一个MyEventHandler””

+0

通常,当你得到了有关错误消息的问题,这是一个好主意,提供该问题的消息。 – 2013-03-14 09:03:00

+0

这里没有用于测试的编译器,但我希望该行读取“虚拟事件EventHandle Interface :: Event”,而不需要其他名称或分配。 – nvoigt 2013-03-14 09:03:25

+0

更新后的帖子与错误信息 – edwabr123 2013-03-14 09:45:55

回答

5

你要使它看起来像这样:

event MyEventHandler^ Event2 { 
    virtual void add(MyEventHandler^ handler) = Interface::Event::add { 
     backingDelegate += handler; 
    } 
    virtual void remove(MyEventHandler^ handler) = Interface::Event::remove { 
     backingDelegate -= handler; 
    } 
}; 
+0

Hans,我欠你!我真的这样做。非常感谢你! – edwabr123 2013-03-14 10:28:58