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);

但是,如果您f1InvalidCastException无法转换为int.

可以创建一个通用实用程序函数来执行此操作,前提是输入类型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);

但这并不比我的第一个例子更简洁,而且我认为第二种方法比第一种方法可读性差一些。


顺便说一句,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 回答