2017-08-15 3 views
0

動的オブジェクトを関数に渡そうとしています。 (以下の簡単なテストである)。しかし、私は、次のコンパイル時のエラー取得しています:動的オブジェクトとアクションの両方を関数に渡すときのエラー

Cannot use a lambda expression as an argument to a dynamically dispatched operation without first casting it to a delegate or expression tree type.

つまたは他のは、両方okです...ではなく...任意のヘルプ?

void Test() 
    { 
     dynamic obj = new System.Dynamic.ExpandoObject(); 
     obj.A = 1; 
     obj.B = 2; 
     Calc(obj, (result) => 
     { 
      Console.Write("Result: " + result); 
     });  
    } 

    void Calc(dynamic obj, Action<int> onComplete) 
    { 
     onComplete((int)obj.A + (int)obj.B); 
    } 

答えて

3

確かに - コンパイラが言うように、正確に行う - コンクリートの型にラムダ式をキャスト:あなたはこれをしなければならない理由は、ラムダ式が型を持っていないということです

Calc(obj, (Action<int>)(result => Console.Write("Result: " + result))); 

- コンパイラは、それを変換しようとしているデリゲート(または式ツリー)の型を知っている必要があります。呼び出しているメソッドが実行時まで選択されない場合は、他の引数が動的である場合には実行できません。

関連する問題