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更改了它。有了这个代表,你就需要一个演员阵容了。对不起,错过了。