C# 传递函数<;IList,int>;使用Func<;IEnumerable,int>;?
我想将C# 传递函数<;IList,int>;使用Func<;IEnumerable,int>;?,c#,generics,C#,Generics,我想将Func传递给采用Func的方法。似乎无法解决。有可能做下面这样的事情吗 class A { void Test() { IList<object> data = new List<object>(); // can't pass in MyFunc, doesn't compile ApplyFunc(MyFunc, data); }
Func
传递给采用Func
的方法。似乎无法解决。有可能做下面这样的事情吗
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);
}
}
A类{
无效测试(){
IList数据=新列表();
//无法传入MyFunc,无法编译
ApplyFunc(MyFunc,数据);
}
int MyFunc(IList数据){
返回0;
}
void ApplyFunc(函数f,IList数据){
f(数据);
}
}
如果泛型是一个选项,您可以执行以下操作:
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);
}
}
A类{
无效测试(){
IList数据=新列表();
//无法传入MyFunc,无法编译
ApplyFunc(MyFunc,数据);
}
int MyFunc(IList数据){
返回0;
}
void ApplyFunc(函数f,可数数据)
其中TEnumerable:IEnumerable
{
f(数据);
}
}
参见小提琴:您的测试方法如下:
public void Test()
{
IList<object> data = new List<object>();
ApplyFunc(x => MyFunc(x as IList<object>), data);
}
公共无效测试()
{
IList数据=新列表();
ApplyFunc(x=>MyFunc(x为IList),数据);
}
因为所讨论的委托被定义为Func(在T,…),所以您只允许使用派生较少的类型。IList(T)实现了IEnumerable(T),它更具派生性
(来自kiziu的评论…)
可能的解决方案是使用lambda(如其他答案之一所述)或更改MyFunc的签名这可能是或的副本。除非我缺少一些无法编译的内容。@CoderBrien更改了它。有了这个代表,你就需要一个演员阵容了。对不起,错过了。