質問はone by John Kと似ていますが、より具体的で、受け入れられる答えが私のニーズに合っていません。式でLambdaExpressionを初期化できません。
これは罰金コンパイル:
Expression<Func<object, object>> specificExpression = (object o) => new object();
Expression generalExpression = specificExpression;
そして、この1はしません:
Expression generalExpression = (object o) => new object();
は、コンパイルエラーを報告しました:
Cannot convert lambda expression to type 'System.Linq.Expressions.Expression' because it is not a delegate type
Expression<Func<T1,T2>>
がExpression
に由来します。
ここでは、すべての種類の式を受け入れるメソッドを持つフレームワーク、つまりExpression
があります。明示的にラムダを対応するExpression<Func<T1,T2>>
にそれぞれのメソッド呼び出しで強制的にキャストするのは不愉快です。
この場合、この基本的なOOPの動作が壊れている理由はありますか?
この論理に従うと、 '' var''キーワードは常にコンパイル時エラーを生成します。 '' var o = "abc" ''は '' Object''である可能性がありますか?どういうわけか、型推論は '' var''で動作し、私の例ではすべての情報が実際に提供されています(引数型と戻り型は推測できます)。 –
'var'は、式の右辺が評価されるどんな型でも変数を宣言するように特に定義されています。この場合、コンパイラは式の右辺が何であるかをまだ知りません! *任意のデリゲート型または*任意の*式の型にすることができます。この場合、コンパイラは "予想される型"を使って右側の処理方法を決定できますが、左側の型に 'var'や' Delegate'や 'Expression'を使うと、右側の式の型を解決するコンパイラ。 – cdhowie
つまり、 'Expression>'型の変数にラムダを代入することによって、コンパイラは 'object'を取る式ツリーとしてラムダを解決するヒントを得て、オブジェクト '。しかし、 'Expression'型の変数に代入すると、コンパイラがラムダをどの型に変換する必要があるかを理解するのに十分な有用な情報が含まれていません。 –
cdhowie