2017-07-29 21 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(入力)' - > 'foo((オブジェクト)入力)' – PetSerAl

+0

@PetSerAlなぜですか?コンパイラが2回目の呼び出しでエラーを報告するのはなぜですか? –

答えて

5

the feature specを見る

解像度に分解するパラメータの適切な数のrhs.Deconstruct(out var x1, out var x2, ...);を入力することと等価です。これは、通常の過負荷解決に基づいています。これは、rhsを動的にすることはできず、Deconstructメソッドのパラメータのいずれも型引数ではないことを意味します。 ...

重要な部分はvarです。 通常のオーバーロードの解決では、発見されたメソッドDeconstructからタイプを推論できます。しかし、動的メソッド呼び出しでは、コンパイル時の型情報を取得できないため、var型は必ず推論されずに残されます(つまり、エラーです)。あなたは(ローカルアウトVARのvarタイプは何ですか?)動的呼び出しにout varを使用できない理由

より一般的には、これがあります。

関連する問題