17

ここで何が起こっているのかわかりません:

これらの行は両方ともコンパイルされます。

 Func<object> func = () => new object();

 Expression<Func<object>> expression = ()=>new object();

しかし、これはしません:

 expression = func;

LambdaExpressionorには、デリゲートを式に変換する暗黙の演算子がないExpression<TDelegate>ため、割り当てを機能させるには、何か他のことが起こっている必要があります。それは何ですか?

4

1 に答える 1

30

これは、通常の意味での暗黙的な変換ではありません。コンパイラのトリックです。コンパイラは、コンテキストから期待されるものを検出し、それをデリゲート (クラスの隠しメソッド) または式 (でメソッドを呼び出して式を構築するコードのチャンク) としてコンパイルしますSystem.Linq.Expressions.Expression

objectこれが、タイプorの変数にラムダ式を直接割り当てることができない理由ですvar。コンパイラは、デリゲートと式のどちらを意味するのかを認識できる必要があるためです。

于 2011-05-02T20:46:26.103 に答える