一位同事写了这个扩展方法,我想为下面的例子提供一个例子:
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();
}
}
}
总而言之,我希望确保我没有错过任何关于我的代码的内容,并且假设我还没有理解为什么无法推断出参数类型。
答案 0 :(得分:1)
您的方法只是一个委托,因此没有任何可能被推测的泛型类型参数。
当您将OffsetChars
定义为通用Func
时,它们就可以正常使用了:
public static Func<string, int, string, string> OffsetChars = (x, i, y) =>
{
return x + y[i];
};
答案 1 :(得分:-1)
WERTZUI是对的,因为委托没有任何泛型参数,编译器无法推断它,所以你有se错误。