6

Funcデリゲートに拡張メソッドを作成することは可能ですか?たとえば、関数を作成できるのと同じように

bool isSet(this string x) {return x.Length > 0;}

のようなものを書けるようになりたい

Func<string, bool> isSet = (this x => x.Length > 0);

もちろん、上記は構文的に正しくありません。何かありますか?そうでない場合、それは構文またはコンパイルの制限ですか?

4

3 に答える 3

14

簡単な答え:いいえ、それは不可能です。

拡張メソッドはシンタックスシュガーであり、特定の状況(静的クラス内の静的メソッド)でのみ定義できます。ラムダ関数でこれに相当するものはありません。

于 2012-06-25T16:30:35.613 に答える
7

Funcデリゲートに拡張メソッドを作成することは可能ですか?

いいえ。拡張メソッドは、トップレベルの(ネストされていない)非ジェネリック静的クラスの通常の静的メソッドとして宣言する必要があります。

メソッドのスコープに対してのみ拡張メソッドを作成しようとしているようです。C#にはそのような概念はありません。

于 2012-06-25T16:31:58.723 に答える
4

なぜこれが必要なのかについてのコメントの質問に答えるには、isSet funcを通常どおりに定義し、それをメソッド呼び出しとして使用します。これは、拡張メソッドと同じ効果がありますが、構文が異なります。

使用法の構文の違いは、文字列をその文字列のメソッドとして呼び出すのではなく、パラメータとして渡すことです。

実例:

public void Method()
{
    Func<string, bool> isSet = (x => x.Length > 0);

    List<string> testlist = new List<string>() {"", "fasfas", "","asdalsdkjasdl", "asdasd"};
    foreach (string val in testlist)
    {
        string text = String.Format("Value is {0}, Is Longer than 0 length: {1}", val, isSet(val));
        Console.WriteLine(text);
    }
}

このメソッドは、上記のようにisSetを定義します(ただし、この構文はありません)。次に、テスト値のリストを定義し、それらを繰り返して出力を生成します。その一部は、を呼び出しているだけisSet(val)です。Funcsはこのように非常に楽しく使用でき、私が思うようにあなたが望むことをするはずです。

于 2012-06-25T16:51:47.570 に答える