为什么Funcs不接受超过16个参数?由于Javascript是我最流利的语言,所以我熟悉将函数用作一流对象。我以为C#缺少此功能,但后来我听说了Func和Action以及委托,我认为它们非常酷。例如,您可以声明一个连接两个字符串的Func,在它们之间放置一个空格,如下所示:Funcconcat=(a,b)=>a+""+b;当您键入GottoFunc时,我注意到IntelliSense显示它有17个重载:委托System.Func委托System.Func委托System.Func...snip...委托System.Func这让我笑了。我看了看Func的MSDN文档,又笑了。这让我尝试声明一个带有17个参数的Func。它会导致错误(使用通用类型“System.Func”需要1个类型参数)。我同意,拥有一个接受超过16个参数的Func可能不是一个好主意。即便如此,这似乎是Func的实现方式。它需要记录17个简单的不同重载。这就是它真正需要知道的全部:最后一个类型参数是返回类型,它之前的所有类型参数都是参数类型。那么,如果我想创建一个参数超过16个的Func怎么办呢?为什么还有限制?为什么C#不允许您声明具有任意数量参数的Func?您希望拥有类似于C#所缺乏的可变类型参数。C#需要修复泛型类型的数量,因此Func、Action和Tuple类型的可怕扩散。如果你正在选购语言,这个功能是在C++11中添加的,但你应该只使用jQuery。?您只需定义您需要的任何委托。因此,具有20个参数的Func将定义如下:publicdelegateRFunc(P0p0,P1p1,P2p2,P3p3,P4p4,P5p5,P6p6,P7p7,P8p8,P9p9,P10p10,P11p11,P12p12,P13p13,P14p14,P15p15,P16p16,P17p17,P18p18,P19p19);然后你可以这样使用它:Funcf=(p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19)=>p0+p1+p2+p3+p4+p5+p6+p7+p8+p9+p10+p11+p12+p13+p14+p15+p16+p17+p18+p19;varr=f(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1);C#还允许您在任何委托上使用lambda语法,因此您也可以这样做:publicdelegateRArrayFunc(paramsP[]parameters);并像这样使用它:ArrayFuncaf=ps=>ps.Sum();varar=af(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1);它是该语言的一个非常灵活和强大的特性。我想我明白了——你可以用JavaScript和函数(参数)做的事情很简洁,而且它也不是静态类型的。但请注意,无论如何在函数式编程中您永远不需要多个参数。您可以通过返回另一个函数来链接任意数量的参数(这是FP中的一个共同特征,并且通常用于限制JS中可用的技术,但只是稍微弯曲了系统)。当然这在C#中很尴尬:Func>...>x1=>(x2=>(x3=>...(xn=>{/*returnsomething*/}))...);但这就是F#的用途;)当然,您无论如何都不应该创建具有多个参数(远低于16!)的函数。您可以使用超过16个参数创建自己的委托。或者您可以使用元组(或任何其他数据结构)作为参数。多亏了BCL团队,可能会有一个System.Func代表。他们意识到包含有限数量的预定义通用委托会很方便(在许多情况下甚至是必需的)。照你说的做......即Func委托的无限数量的通用参数需要更改语言。c#和vb.net团队(可能还有其他团队)有责任更改语言以允许这样做。也许,在某些时候,如果此功能的好处超过了预定义少数Func委托的成本,这比其他语言更改更重要(并且这不是重大更改)相关团队我的工具具有无限的通用参数..可能已经有一段时间了!为什么还是有限制?有一种说法认为一个函数的参数可能不应该超过3个。如果它有更多,它会变得越来越难以理解。当然,这可能不是C#中的方式的原因,但这种限制可能毕竟不是一件坏事。我认为即使是这个16的限制也太多了,并且已经鼓励了糟糕的设计选择。以上是C#学习教程:为什么Funcs不接受超过16个参数?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
