转换函数<>类型
本文关键字:类型 函数 转换 | 更新日期: 2023-09-27 17:56:32
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
}
有解决办法吗?
这应该有效:
f1 = p => f2((int)p);
但是,自然地,如果您将其传递给无法投射到int
的东西,则使用此f1
会产生InvalidCastException
。
可以创建一个通用实用程序函数来执行此操作,前提是输入类型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
类型,因为编译器无法推断它。