无法使用Func推断类型参数

时间:2016-01-26 09:40:01

标签: c# func

一位同事写了这个扩展方法,我想为下面的例子提供一个例子:

namespace ExtensionMethods {
    public static class MyExtensions {
        public static Res MyAggregate<T, Res>(this IEnumerable<T> source, Func<Res, int, T, Res> f) {
            var i = 0;
            Res result = default(Res);
            foreach (T x in source) {
                result = f(result, i, x);
                i++;
            }
            return result;
        }
    }
}

它创建了一个通用的Aggregate方法,该方法还包含一个索引。

我的例子(接下来)采用字符串列表并加入第一个字的第一个字母,第二个字母的第二个字母等。

namespace ExtensionMethods {

    public class Program {
        public static string OffsetChars(string x, int i, string y) {
            return x + y[i];
        }

        static void Main(string[] args) {
            List<string> test = new List<string>() { "hello", "there", "you" };
            // get h from (h)ello, h from t(h)ere and u from yo(u) (hhu)
            string result = test.MyAggregate<string, string>(OffsetChars);
            Console.WriteLine(result);

            Console.ReadKey();
        }
    }
}

我的问题是关于这一行(重要的一行):

string result = test.MyAggregate<string, string>(OffsetChars);

如果没有<string, string>,则会出现错误,即无法从使用中推断出参数类型。我的问题:

为什么他们不能被推断?我的代码中是否缺少可以推断出它们的东西?

我使用显式委托进行了测试(如下)但发生了同样的错误:

namespace ExtensionMethods {
    delegate string OffsetMethod(string x, int i, string y);

    public class Program {
        public static string OffsetChars(string x, int i, string y) {
            return x + y[i];
        }

        static void Main(string[] args) {
            List<string> test = new List<string>() { "hello", "there", "you" };
            // get h from (h)ello, h from t(h)ere and u from yo(u) (hhu)

            OffsetMethod myMethod = OffsetChars;

            string result = test.MyAggregate(myMethod);
            Console.WriteLine(result);

            Console.ReadKey();
        }
    }
}

总而言之,我希望确保我没有错过任何关于我的代码的内容,并且假设我还没有理解为什么无法推断出参数类型。

2 个答案:

答案 0 :(得分:1)

您的方法只是一个委托,因此没有任何可能被推测的泛型类型参数。 当您将OffsetChars定义为通用Func时,它们就可以正常使用了:

public static Func<string, int, string, string> OffsetChars = (x, i, y) =>
{
    return x + y[i];
};

答案 1 :(得分:-1)

WERTZUI是对的,因为委托没有任何泛型参数,编译器无法推断它,所以你有se错误。