其他人已经指出,您可能意味着有无数种可能的委托类型;有什么特别之处Func
以至于它应该成为默认值而不是Predicate
或Action
任何其他可能性?而且,对于 lambdas,为什么选择委托形式而不是表达式树形式很明显?
但我们可以说这Func
是特殊的,lambda 或匿名方法的推断类型是某种东西的 Func。我们仍然会遇到各种各样的问题。对于以下情况,您希望推断出哪些类型?
var x1 = (ref int y)=>123;
没有任何Func<T>
类型可以引用任何东西。
var x2 = y=>123;
我们不知道形参的类型,尽管我们知道返回值。(或者我们呢?返回的是 int?long?short?byte?)
var x3 = (int y)=>null;
我们不知道返回类型,但它不能为 void。返回类型可以是任何引用类型或任何可为空的值类型。
var x4 = (int y)=>{ throw new Exception(); }
同样,我们不知道返回类型,这一次它可能是 void。
var x5 = (int y)=> q += y;
那是打算成为返回无效语句 lambda 还是返回分配给 q 的值的东西?两者都是合法的;我们应该选择哪个?
现在,您可能会说,好吧,只是不支持任何这些功能。只支持可以计算类型的“正常”情况。那没有帮助。这如何让我的生活更轻松?如果该功能有时有效,有时失败,那么我仍然必须编写代码来检测所有这些失败情况,并为每种情况提供有意义的错误消息。我们仍然必须指定所有这些行为、记录它、为其编写测试等等。这是一个非常昂贵的功能,可以为用户节省大约六次击键。我们有更好的方法来增加语言的价值,而不是花大量时间为一个在一半时间不起作用并且在它起作用的情况下几乎没有任何好处的功能编写测试用例。
它实际有用的情况是:
var xAnon = (int y)=>new { Y = y };
因为那个东西没有“可说”的类型。但是我们一直有这个问题,我们只是使用方法类型推断来推断类型:
Func<A, R> WorkItOut<A, R>(Func<A, R> f) { return f; }
...
var xAnon = WorkItOut((int y)=>new { Y = y });
现在方法类型推断可以确定 func 类型是什么。