struct ArgumentList {
        int x;
        string text1;
};

/////////////////////////////////////////

ArgumentList arg1={12,"text123"}
WorkerThread->RunWorkerAsync(arg1);

Я хочу передать arg1, но компилятор говорит: «Ошибка C2664: 'void System::ComponentModel::BackgroundWorker::RunWorkerAsync(System::Object ^)': невозможно преобразовать параметр 1 из 'ArgumentList' в 'System::Object ^' "

System::Void backgroundWorker2_DoWork(System::Object^  sender, System::ComponentModel::DoWorkEventArgs^  e) {
    //Do stuff with e->Argument
    ArgumentList passedarg=(ArgumentList)e->argument; //'type cast' : cannot convert from 'System::Object ^' to 'ArgumentList'
    int y=passedarg.x
    string text2=passedarg.text1
    //...

        }
1
Carl 28 Мар 2011 в 11:00
Это std::string? Вам придется пройти через некоторые препятствия, чтобы хорошо играть с BackgroundWorker, вместо этого рассмотрите возможность использования System::String^.
 – 
Ben Voigt
29 Мар 2011 в 07:58

1 ответ

Похоже, вам нужно объявить свою структуру как управляемую структуру с помощью ключевое слово ссылка

ref struct ArgumentList {
        int x;
        string text1;
};

Таким образом, он будет корректно унаследован от типа объекта (базовый объект для всех управляемых классов), который RunWorkerAsync(Object) ожидает

1
Stephen Bailey 29 Мар 2011 в 14:23
1
Это не то, что большинство программистов .NET считают "управляемой структурой". Это будет «структура значений» или «класс значений». Однако в этом случае ссылочный тип, вероятно, лучше.
 – 
Ben Voigt
29 Мар 2011 в 07:57