我最近安装了VS 2019,并打开了在VS 2017中创建的项目。该软件可以正常运行,但VS中存在lambda捕获变量的错误。 MS显然知道了上述问题,但是我想知道最近是否有人遇到过这个问题,如果有,您是否能够解决?
我的项目中的示例代码,智能感知已经标记了出现“ [this]”的每一行。错误/错误显示为
类型为“ MainPage ^ *”的lambda捕获变量无法复制到类型为“ MainPage ^”的闭包类字段中
if (_serialPort1 != nullptr)
{
concurrency::create_task(WriteToSerialDeviceAsync(cancellationTokenSource_serialPort1->get_token(),
Arduino_Device.Outgoing_Bytes, PORT_1)).then([this](concurrency::task<void> previousTask) {
try
{
previousTask.get();
}
catch (Platform::COMException^ ex)
{
this->DataStreamWindow->Text += "\r\n!EXCEPTION CAUGHT! " + ex->Message;
}
});
}
答案 0 :(得分:1)
好吧,我设法找到了一个难看的骇客来解决这个问题。
我没有将[this]
传递给lambda,而是在创建任何任务之前添加了行auto _this = this;
。但是,这确实意味着使用this->SomeVariable
访问的所有变量都变成了_this->SomeVariable
。
所以我上面的示例现在看起来像这样。
if (_serialPort1 != nullptr)
{
auto _this = this;
concurrency::create_task(WriteToSerialDeviceAsync(cancellationTokenSource_serialPort1->get_token(),
Arduino_Device.Outgoing_Bytes, PORT_1)).then([_this](concurrency::task<void> previousTask) {
try
{
previousTask.get();
}
catch (Platform::COMException^ ex)
{
_this->DataStreamWindow->Text += "\r\n!EXCEPTION CAUGHT! " + ex->Message;
}
});
}
希望这是有用的。
答案 1 :(得分:0)
如果是,那么为什么要在任务之外进行复制?您可以
if (_serialPort1 != nullptr)
{ concurrency::create_task(WriteToSerialDeviceAsync(cancellationTokenSource_serialPort1->get_token(),
Arduino_Device.Outgoing_Bytes, PORT_1)).then([_this = this](concurrency::task<void> previousTask) {
try
{
previousTask.get();
}
catch (Platform::COMException^ ex)
{
_this->DataStreamWindow->Text += "\r\n!EXCEPTION CAUGHT! " + ex->Message;
}
});
}
但是根据您的问题,这不是正确的解决方案。您最好找到将项目迁移到VS 2019的问题所在。