由于 Javascript 是我最精通的语言,因此我熟悉使用函数作为一等对象。我原本以为C#缺少这个功能,但后来我听说了Func
and Action
and delegate
,我认为这非常棒。
例如,您可以声明一个Func
连接两个字符串并在它们之间放置一个空格,如下所示:
Func<string, string, string> concat = (a,b) => a + " " + b;
我注意到当你输入时
Func<
IntelliSense 显示它有 17 个重载:
delegate System.Func<out TResult>
delegate System.Func<in T, out TResult>
delegate System.Func<in T1, in T2, out TResult>
...snip...
delegate System.Func<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13, in T14, in T15, in T16, out TResult>
这让我笑了。我看了看MSDN 文档 http://msdn.microsoft.com/en-us/library/dd402862.aspx#Y163 for Func
然后又笑了。这让我尝试声明一个Func
有 17 个参数。它会导致错误(Using the generic type 'System.Func<TResult>' requires 1 type arguments
).
我同意,拥有一个可能不是一个好主意Func
接受超过 16 个参数。即便如此,这似乎是一种笨拙的方式Func
将要执行。它需要记录 17 个截然不同的重载。这就是它真正需要知道的一切:最后一个类型参数是返回类型,它之前的所有类型参数都是参数类型。
那么如果我想创建一个Func
超过 16 个参数?为什么还是有限制呢?为什么 C# 不能让你声明一个Func
具有任意数量的参数?