为什么在混合C#ValueTuple和动态时这个编译器会出错

Xia*_* Ge 8 c# dynamic roslyn c#-7.0

当使用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
}
Run Code Online (Sandbox Code Playgroud)

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

Jul*_*eur 9

查看功能规格:

分辨率相当于rhs.Deconstruct(out var x1, out var x2, ...);使用适当数量的参数进行解析以进行解构.它基于正常的重载分辨率.这意味着rhs不能是动态的,并且Deconstruct方法的任何参数都不能是类型参数....

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

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