我最近安装了VS 2019,并打开了我在VS 2017中创建的项目。该软件运行良好,但 VS 中存在一个带有 lambda 捕获变量的错误。MS显然知道上述问题,但我想知道最近是否有其他人遇到过这个问题,如果有,您是否设法解决了它?
我的项目中的示例代码片段,智能感知已经标记了出现"[this]"的每一行。错误/错误读取
无法将 lambda 捕获的类型为 "MainPage^*" 的变量复制到类型为 "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 += "rn!EXCEPTION CAUGHT! " + ex->Message;
}
});
}
好的,我设法偶然发现了一个有点丑陋的黑客来解决这个问题。
我没有将[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 += "rn!EXCEPTION CAUGHT! " + ex->Message;
}
});
}
希望这是有用的。
如果是这样,那么为什么要在任务之外复制呢?你可以做
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 += "rn!EXCEPTION CAUGHT! " + ex->Message;
}
});
}
但是根据您的问题,这不是正确的解决方案。您最好找出项目迁移到VS 2019的问题。