jac*_*kie 9 c# functional-programming
Cannot convert type 'System.Func<int,bool>' to 'System.Func<object,bool>'
Run Code Online (Sandbox Code Playgroud)
试图将f2强制转换为f1:
Func<object, bool> f1 = x => true;
Func<int, bool> f2 = x => true;
f1 = (Func<object, bool>)f2;
Run Code Online (Sandbox Code Playgroud)
尝试解决地图功能但是,这次我得到了
Argument 1: cannot convert from 'C' to 'A'
Run Code Online (Sandbox Code Playgroud)
例外.关于转型(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
}
Run Code Online (Sandbox Code Playgroud)
有解决方案吗?
JLR*_*she 11
这应该工作:
f1 = p => f2((int)p);
Run Code Online (Sandbox Code Playgroud)
然而,自然地,使用它f1会产生一个InvalidCastException如果你传递给它的东西不能被强制转换为int.
如果输入类型f2 继承自输入类型f1(在您的示例中为true - int派生自object),则可以创建通用实用程序函数来执行此操作:
static Func<TOut, TR> ConvertFunc<TIn, TOut, TR>(Func<TIn, TR> func) where TIn : TOut
{
return p => func((TIn)p);
}
Run Code Online (Sandbox Code Playgroud)
然后你可以像这样使用它:
f1 = ConvertFunc<int, object, bool>(f2);
Run Code Online (Sandbox Code Playgroud)
但这并不比我的第一个例子更简洁,我认为第二种方法比第一种方法更不易读.
顺便提一下,Map()如果按正确的顺序放置类型参数,则可以编译您的方法:
static Func<TNewIn, TOut> Map<TOrigIn, TNewIn, TOut>(Func<TOrigIn, TOut> input,
Func<TNewIn, TOrigIn> convert)
{
return x => input(convert(x));
}
Run Code Online (Sandbox Code Playgroud)
你可以这样称呼它:
f1 = Map(f2, (object x) => (int)x);
Run Code Online (Sandbox Code Playgroud)
您需要明确指出NewIn类型,因为编译器无法推断它.
| 归档时间: |
|
| 查看次数: |
5385 次 |
| 最近记录: |