11
Cannot convert type 'System.Func<int,bool>' to 'System.Func<object,bool>'

f2 を f1 にキャストしようとしています:

    Func<object, bool> f1 = x => true;
    Func<int, bool> f2 = x => true;
    f1 = (Func<object, bool>)f2;

解決するマップ関数を試しましたが、今回は取得します

Argument 1: cannot convert from 'C' to 'A' 

例外。Transform(a) 関数について

    Func<int, bool> f3 = Map(f2, x => x);

    Func<C, B> Map<A, B, C>(Func<A, B> input, Func<A, C> transform)
    {
        return x => input(transform(x));
        // return x => input(transform((A)x)); not working
    }

解決策はありますか?

4

1 に答える 1

14

これはうまくいくはずです:

f1 = p => f2((int)p);

ただし、これを使用すると、 にキャストできないものを渡すと、当然、f1が生成されます。InvalidCastExceptionint

f2 の入力タイプが の入力タイプから継承する場合、これを行うための汎用ユーティリティ関数を作成することができますf1(これはあなたの例では真です -intから派生しますobject):

static Func<TOut, TR> ConvertFunc<TIn, TOut, TR>(Func<TIn, TR> func) where TIn : TOut
{
    return p => func((TIn)p);
}

次に、次のように使用できます。

f1 = ConvertFunc<int, object, bool>(f2);

しかし、これは最初の例よりも簡潔ではありません。また、この 2 番目のアプローチは、最初の例よりやや読みにくいと思います。


ちなみに、Map()型引数を正しい順序で配置すれば、メソッドをコンパイルすることができます。

static  Func<TNewIn, TOut> Map<TOrigIn, TNewIn, TOut>(Func<TOrigIn, TOut> input, 
                                                      Func<TNewIn, TOrigIn> convert)
{
    return x => input(convert(x));
}

次のように呼び出すことができます。

f1 = Map(f2, (object x) => (int)x);

NewInコンパイラが型を推測する方法がないため、型を明示的に示す必要があります。

于 2013-01-30T08:45:27.820 に答える