为什么此编译器在混合 C# 值元组和动态时出错



使用ValueTuple和动态对象时,我收到了这个奇怪的CS8133错误。我正在传递动态对象作为输入并将 ValueTuple 作为输出。为什么它们相互影响。

public static (string, string) foo(dynamic input)
{
return ("", "");
}
public void foo_test()
{
dynamic input = new { a = "", b = "" };
(string v1, string v2) = foo(new { a = "", b = "" }); //compiles fine
(string v3, string v4) = foo(input); //CS8133 Cannot deconstruct dynamic objects
var result = foo(input);  //compiles fine
}

编辑: 错误消息是:CS8133 Cannot deconstruct dynamic objects

请参阅功能规范:

分辨率等效于键入具有适当数量的参数的rhs.Deconstruct(out var x1, out var x2, ...);进行解构。它基于正常的过载分辨率。这意味着 rhs 不能是动态的,并且解构方法的任何参数都不能是类型参数。...

重要的部分是var. 在正常的重载分辨率中,我们可以从发现的Deconstruct方法推断类型。但是使用动态方法调用,您无法获取编译时类型信息,因此var类型必然不会被推断(即这是一个错误(。

更一般地说,这就是为什么你不能在动态调用中使用out var(out var local的var类型是什么?

最新更新