Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当等待具有动态参数的方法时,会引发异常(有时)_C#_.net_C# 4.0_Dynamic_Task Parallel Library - Fatal编程技术网

C# 当等待具有动态参数的方法时,会引发异常(有时)

C# 当等待具有动态参数的方法时,会引发异常(有时),c#,.net,c#-4.0,dynamic,task-parallel-library,C#,.net,C# 4.0,Dynamic,Task Parallel Library,我有以下代码: string commandText = await _client .GetCommandTextAsync("Products", x.ProductName == "Chai"); 第二个参数(x.ProductName==“Chai”)包含一个动态子句(x.ProductName),因此结果表达式也是动态的。在.NET 4.0上执行此代码时,有时会引发以下异常: System.InvalidCastException无法强制转换类型为的对象 要键入'Sys

我有以下代码:

string commandText = await _client
       .GetCommandTextAsync("Products", x.ProductName == "Chai");
第二个参数(x.ProductName==“Chai”)包含一个动态子句(x.ProductName),因此结果表达式也是动态的。在.NET 4.0上执行此代码时,有时会引发以下异常:

System.InvalidCastException无法强制转换类型为的对象 要键入'System.Runtime.CompilerServices.TaskWaiter'1[System.String]' “System.Runtime.CompilerServices.INotifyCompletion”

如果我将方法结果显式case到任务,则不会引发异常:

string commandText = await (Task<string>)_client
       .GetCommandTextAsync("Products", x.ProductName == "Chai");
string commandText=wait(任务)\u客户端
.GetCommandTextAsync(“产品”,x.ProductName==“Chai”);
有没有一种更优雅的方法来解决这个问题(不必强制转换等待动态结果的每一行代码),或者这是在.NET4.0上使用TPL的已知问题

我从未在.NET 4.5上体验过这种情况。

以下是一个理论:

根据定义:

[HostProtectionAttribute(SecurityAction.LinkDemand, Synchronization = true, ExternalThreading = true)]
public struct TaskAwaiter : ICriticalNotifyCompletion, INotifyCompletion
似乎TaskWaiter是一种智能型完成。您说过在代码中有dynamic子句。如MS所述,动态对象的行为大多类似于对象。因此,在由运行时或编译器处理的代码中需要强制转换

您还声明平台是Xamarin iOS。它可能利用HostProtectionAttribute来阻止某些类等的使用

TaskWaiter实现标记为SecurityAction.LinkDemand,如果我们检查它,它会再次显示:

因此,结论是:运行代码的平台缺少主机保护所需的安全实现,并且没有调用方法(安全性未正常工作),强制转换是“安全”操作之一,因此这种类型的运行时强制转换失败


如果您像这样显式地强制转换,则不会有问题,因为编译器不会添加“错误”代码。

相关,可能会回答:我看到了这篇文章。但是它没有解释除了升级到.NET 4.5之外可以做些什么来避免这个问题。你能尝试创建一个GetCommandTextAsync重载,它接受第二个“dynamic”类型的参数并调用原始方法吗?这可能足以帮助编译器静态地解析任务类型,尽管我不是100%确定。我会尝试,但我认为它不起作用。动态是病毒性的:如果一个方法采用了动态参数,那么编译器将把它的结果视为动态的。实际上,我刚刚写了一些类似的东西,它工作了,编译器执行了正常的重载解析并正确地推断了方法的返回类型。你为什么不试试,然后告诉我它在你的情况下是否有效?谢谢你对这个问题的深入研究。该故障也发生在Windows计算机上,因此它不是特定于Xamarin.iOS的。否则,我相信你正确描述了可能的原因。通过显式强制转换,它在.NET4上可以正常工作,在没有强制转换的.NET4.5上也可以正常工作。
...
LinkDemand (do not use in the .NET Framework 4)
...