将Func <ilist,int =“”>传递给一个采用Func <ienumerable,int =“”>的方法?

时间:2016-09-15 22:36:04

标签: c# generics

我想将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);
        }
    }

3 个答案:

答案 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);
    }
}

请参阅小提琴:https://dotnetfiddle.net/juEWYf