我正在将工作 C# 代码转换为 C++/CLI,但我无法理解为什么它不能编译。
我收到的错误:
void MyNamespace::Handler::DataChanged(System::Object ^,System::EventArgs ^)' : the specified function does not match the delegate type 'void (System::Object ^,System::Data::DataRowChangeEventArgs ^)'
我正在将工作 C# 代码转换为 C++/CLI,但我无法理解为什么它不能编译。
我收到的错误:
void MyNamespace::Handler::DataChanged(System::Object ^,System::EventArgs ^)' : the specified function does not match the delegate type 'void (System::Object ^,System::Data::DataRowChangeEventArgs ^)'
看起来 C++/CLI 不像 C# 和 VB 那样支持委托的参数变化,请参阅这个 Microsoft 连接错误报告。
作为一种解决方法,您可以将您对处理程序的调用包装在一个包装器中,该包装器采用 DataRowChangeEventArgs 并调用您的处理程序:
public ref class MyClass
{
....
public:
void MyClass::Delegates(DataTable ^table)
{
Handler ^handler = gcnew Handler();
DataRowChangeEventForwarder& forwarder =
gcnew DataRowChangeEventForwarder(
new EventHandler(handler, &MyNamespace::Handler::DataChanged)));
table->RowChanged += gcnew DataRowChangeEventHandler (forwarder, &MyNamespace::MyClass::RowChangedDelegate);
}
}
public ref class DataRowChangeEventForwarder
{
private:
EventHandler^ eventHandler;
public:
EventForwarder(EventHandler^ eventHandler)
{
this->eventHandler = eventHander;
}
void MyClass::RowChangedDelegate(Object ^sender, DataRowEventArgs ^arg)
{
handler->DataChanged(sender, arg);
}
}
这是该错误的完整编译就绪再现(可能是注释,但格式会很糟糕):
public ref struct A
{
};
public ref struct B : A
{
};
public ref struct C
{
delegate void DType(B^);
void F(A^ a) { };
};
int main(void)
{
C^ c = gcnew C;
C::DType^ del = gcnew C::DType(c, &C::F);
}