我想将Func<IList<object>, int>
传递给采用Func<IEnumerable<object>, int>
的方法。似乎无法解决这个问题。可以做下面这样的事情吗?
class A {
void Test() {
IList<object> data = new List<object>();
// can't pass in MyFunc, doesn't compile
ApplyFunc(MyFunc, data);
}
int MyFunc(IList<object> data) {
return 0;
}
void ApplyFunc(Func<IEnumerable<object>, int> f, IList<object> data) {
f(data);
}
}
答案 0 :(得分:3)
因为有问题的委托被定义为Func(在T中,...),所以只允许使用较少派生的类型。 IList(T)实现更多派生的IEnumerable(T)。
(来自kiziu的评论......) Conversion from Func<object,string> to Func<string,string> works but to Func<int,string> fails
可能的解决方案是使用lambda(如其他答案中所述)或更改MyFunc的签名
答案 1 :(得分:2)
您的测试方法如下:
public void Test()
{
IList<object> data = new List<object>();
ApplyFunc(x => MyFunc(x as IList<object>), data);
}
答案 2 :(得分:-2)
如果可以选择泛型,您可以这样做:
class A {
void Test() {
IList<object> data = new List<object>();
// can't pass in MyFunc, doesn't compile
ApplyFunc(MyFunc, data);
}
int MyFunc(IList<object> data) {
return 0;
}
void ApplyFunc<TEnumerable>(Func<TEnumerable, int> f, TEnumerable data)
where TEnumerable : IEnumerable<object>
{
f(data);
}
}