Дисперсия делегата в c ++ / cli - PullRequest
2 голосов
/ 21 июля 2011

Я нахожусь в процессе преобразования рабочего кода 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 ^)'

Ответы [ 2 ]

2 голосов
/ 21 июля 2011

Похоже, что 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);
     }
 }
0 голосов
/ 21 июля 2011

Вот полное готовое к компиляции воспроизведение ошибки (будет комментарий, но форматирование будет ужасным):

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...