私はクラスがあるとします。Funcと式の間にラムダ式の引数があいまいになるのはなぜですか?<Func>?
class MyClass {
public int MyMethod(Func<int, int> f) { return 0; }
public int MyMethod(Expression<Func<int, int>> f) { return 1; }
}
私はラムダ式でメソッドを呼び出すしようとすると、私はコールは2つのオーバーロードの間であいまいであることを示すコンパイルエラーを取得:
var myClass = new MyClass();
myClass.MyMethod(x => 1 + x); // Error!
正常に動作し、もちろん、明示的なタイプで呼び出すことながら:
myClass.MyMethod((Func<int, int>)(x => 1 + x)); // OK, returns 0
myClass.MyMethod((Expression<Func<int, int>>)(x => 1 + x)); // OK, returns 1
式ツリーは、より多くの情報(実際のコード)を含み、そして私がwaかもしれませんこの情報を利用できるようにするには、この情報を利用してください。しかし、私もコードを代理人と一緒に使いたいと思っています。残念なことに、このあいまいさにより、2つの呼び出しを区別する別の方法を見つける必要があります。これは、きれいなAPIを混乱させます。
C#仕様では、この特定の状況について何も言及していないため、この動作は仕様と一致します。
ただし、表現ツリーはデリゲートよりも優先されるべきであるという議論があります。 Compile
メソッドは、式ツリーからデリゲートへの明示的な変換として機能します。式ツリーには詳細情報が含まれています。デリゲートにコンパイルすると、その情報が失われます。他の方向への変換はありません。
表現木を好まない理由はありますか?
「Func」を支持する議論は、比較的高価な合併段階を経ることなく直接実行できるということです。 – Lee