7

メソッドのオーバーロードを2つ書き込もうとすると、1つはExpression<Func<T>>パラメーターを受け入れ、もう1つはを受け入れますFunc<T>。2つのシグネチャがあいまいさを生み出すため、ラムダ式を使用してメソッドを呼び出そうとするとコンパイラエラーが発生します。たとえば、次の問題が発生します。

Method(() => "Hello"); // Is that a Func<string>,
                       // or is it an Expression<Func<string>>?

わかりました。Expression<Func<string>>しかし、これは呼び出し元のコードにラムダ式を使用するように強制するため、単に受け入れるというアプローチは好きではありません。メソッドグループも受け入れられるようにするにはどうすればよいですか?

この質問をするための私の基礎は、私がこのような何かを書くことができるようにしたいいくつかのコードに取り組んでいるということです:

Method(() => "Hello");

...そして次のような出力を取得します:

'()=> "Hello"'を実行し、"Hello"を取り戻しました。

その間、私もこれを実行できるようにしたいと思います。

Method(ReturnHello);

...そして次のような出力を取得します:

「ReturnHello」を実行し、「Hello」を取り戻しました。

ExpressionMethod2つの異なるメソッド名(たとえば、 )を使用せずに、ここで実行しようとしていることを実行する方法はありますFuncMethodか?それはそれほど大したことではないだろうと私は理解しています。別の方法があるかどうかだけ知りたいです。

4

2 に答える 2

1

Func<T>メソッドをオーバーロードしてorのいずれかを取ることができExpression<Func<T>>ますが、そうすると自動型決定が失敗するため、キャストによって型を明示的に定義する必要があります。このような:

public static void Test()
{
    Test((Func<string>)(() => "helllo"));
    Test((Expression<Func<string>>) (() => "hello"));
}

public static void Test<T>(Func<T> func)
{

}

public static void Test<T>(Expression<Func<T>> expression)
{

}

それはきれいではありません。

于 2010-10-21T20:01:04.693 に答える
1

おそらく、デフォルト値がnullの2つの名前付きパラメーターを持つ1つのメソッドを作成します。

public static void Test<T>(Func<T> func = null, Expression<Func<T>> expression = null)
{
}

これで OR を見逃していることは知っていますが、メソッドで簡単に確認できます。

于 2010-10-21T20:15:51.193 に答える