13

私は次のことができるようにしたいと思います:

Func<int,bool> tryMethodFunc = TryMethod;

TryMethod には次のような署名があります。

bool TryMethod(int value, int value2 = 0, double value3 = 100.0)

メソッドをカリー化された形式に分割することに反対しているわけではありませんが、それなしでこれを行う方法があれば、それはより多くの作業になります。

4

1 に答える 1

8

オプションのパラメーターは言語機能です。コンパイラーは、オプションのパラメーターを使用したメソッドへの呼び出しを、値を使用した完全な呼び出しに変換する責任があります。

以下の簡単なコードを見てください。

    public void GeneralMethod()
    {
        TestMethod(6);
    }

    public bool TestMethod(int a, int b = 8)
    {
        return true;
    }

これらのメソッドを逆アセンブルすると、C# コンパイラが TestMethod の呼び出しを 1 つのパラメーターで実際に置き換え、両方のパラメーターを使用した呼び出しに置き換えたことがわかります。ildasm のスクリーンショットは、次のことを証明しています。

イダズムのスクリーンショット

さて、現在の問題に来て、問題のコード行は Func をオプションのパラメーターを持つメソッドにバインドしようとしています。C# コンパイラがこれを処理する必要がある場合、Func some が既定値を認識していることを確認する必要があります。これはコンパイラによって実現できたかもしれませんが、Func の目的を完全に無効にします。

Func の目的は、一般化された単純な方法で匿名メソッドを格納する方法を提供することです。"参照

スタックオーバーフローの別の同様の質問がここにあります

@Chris Sinclair のソリューションは、1 つのパラメーターを取り、この匿名メソッドの本体から TryMethod を呼び出す匿名メソッドを作成することで、これを回避します。

于 2012-12-10T19:52:36.723 に答える