2017-07-29 53 views
3

當使用ValueTuple和動態對象時,我收到這個奇怪的CS8133錯誤。我傳遞動態對象作爲輸入並將ValueTuple作爲輸出。他們爲什麼互相影響。爲什麼這個編譯器錯誤混合C#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

+3

什麼是錯誤信息? –

+0

'foo(input)' - >'foo((object)input)' – PetSerAl

+0

@PetSerAl但是爲什麼。爲什麼編譯器只在第二次調用時報告錯誤 –

回答

5

參見the feature spec

分辨率相當於用參數來解構成適當數目打字rhs.Deconstruct(out var x1, out var x2, ...);。它基於正常的重載分辨率。這意味着rhs不能是動態的,並且Deconstruct方法的參數都不能是類型參數。 ...

重要的部分是var。 在正常的重載分辨率下,我們可以從Deconstruct方法中推斷出發現的類型。但是對於動態方法調用,您無法獲得編譯時類型信息,因此var類型必須保持未被推斷(即,這是錯誤)。

更一般地說,這就是爲什麼你不能在動態調用中使用out var(什麼是out var local的var類型?)。

相關問題