为什么在混合 C# ValueTuple 和动态时出现此编译器错误

Why this compiler error when mixing C# ValueTuple and dynamic

当使用 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

参见the feature spec

The resolution is equivalent to typing rhs.Deconstruct(out var x1, out var x2, ...); with the appropriate number of parameters to deconstruct into. It is based on normal overload resolution. This implies that rhs cannot be dynamic and that none of the parameters of the Deconstruct method can be type arguments. ...

重要的部分是 var。 在正常的重载解析中,我们可以从发现的 Deconstruct 方法中推断出类型。但是对于动态方法调用,您无法获得编译时类型信息,因此 var 类型必然未被推断(即,这是一个错误)。

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