Why this compiler error when mixing C# ValueTuple and dynamic

时间:2017-07-29 02:04:26

标签: c# dynamic roslyn c#-7.0

When using ValueTuple and dynamic object, I received this weird CS8133 error. I am passing dynamic object as input and taking ValueTuple as output. Why are they affecting each other.

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
}

Edit: The error message is: CS8133 Cannot deconstruct dynamic objects

1 个答案:

答案 0 :(得分:8)

请参阅the feature spec

  

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

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

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