2

オブジェクトで呼び出すことができる拡張メソッドを作成したいと考えています。

戻り値は関数によって定義されます。

このようなもの: (これは単なる例です)

bool isMature= thePerson.Age.Apply<bool>(d =>   {    if (d >18) return true;
                                                        return false;
                                                 })

拡張メソッドは次のとおりです。

  public static Tout Apply<Tout>(this Object obj, Func< Tout> f)  
        {

            return f( );
        }

エラー:互換性のない無名関数の署名

私は何を間違っていますか?

4

4 に答える 4

7

メソッドはFunc<Tout>- だけを取ります。これは、パラメーターを取らず、値を返す関数です。

ラムダ式にはパラメーター ( d) があり、それが整数であると想定しているようです。何をしようとしているのかは明確ではありませんが、ラムダ式でパラメーターを使用する場合は、署名をFunc<TResult>toFunc<TArg, TResult>または同様のものに変更し、呼び出しで引数を指定する必要があります。

于 2013-02-06T16:25:36.193 に答える
3

デリゲート インスタンスへの入力がプロパティ値であると想定しているように見える場合は、この引数を取るように拡張メソッドの定義を変更する必要があります。

public static TOut ToFunc<TProperty, TOut>(this TProperty obj, Func<TProperty, TOut> f)  
{
   return f(obj);
}

// Usage
bool isMature = thePerson.Age.ToFunc<int, bool>(d => d > 18);

問題が何であれ、それは奇妙なアプローチのようです。

于 2013-02-06T16:30:19.770 に答える
2

これは無意味な演習です。devdigitalはあなたの質問に答えましたが、その答えは何に使用されますか。

だから私はコードを書くことができます、

var greaterThan18 = 20.ToFunc(n => n > 18);

しかし、なぜ私は書かなかった

var greaterThan18 = 20 > 18;

得られるのは間接的な層だけです。

于 2013-02-06T17:03:40.910 に答える
0

私は次のようなことをすることができました:

  public static Tout ToFunc<T,Tout>(this T obj, Func<T, Tout> f)  
        {
            return f(obj);
        }

そして呼び出しは

  var isMature = theperson.Age.ToFunc<int, bool>(i => i > 18);

<int, bool>ただ、毎回指定するのは嫌でした

しかし、resharper のおかげで、思い出したのですが、次のように呼び出すことができます。

  var isMature = theperson.Age.ToFunc(i => i > 18);

ただし、小さなものには便利なユーティリティです。isMature( ....しかし .... を示す bool プロパティを持つ方が良いでしょうが、それは素晴らしいことです。)

于 2013-02-06T16:58:58.037 に答える