C#方法可以定义的参数的最大数量是多less?

我想弄清楚什么C#中的方法可以有最大数量的参数。 我已经到处检查了一个答案,包括C#官方文档,MSDN和几个CLR引用,我找不到答案。 有没有人有这个问题的答案?

这是你的理论答案:

为了将方法参数推送到堆栈,编译代码有以下MSIL操作码可供select:

ldarg.0

ldarg.1

ldarg.2

ldarg.3

ldarg.S

ldarg

ldarg.0ldarg.3用于将前4个方法参数压入堆栈(包括作为实例方法的第一个参数)。

ldarg.S需要一个8位的参数号,所以它可以用来将最多256个参数压入堆栈。

这给我们留下了简单的旧的ldarg ,它可以处理最多的方法参数:它需要一个无符号的16位参数号。 所以可以被成功编译成有效的MSIL的参数的最大数量是2^16 = 65,536

然而,正如其他人所指出的那样,实际上根据系统的平台/体系结构尝试执行您的方法时,存在各种实际的堆栈大小限制。 根据rmiesen的回答,看起来当前的.NET实现将运行时的最大堆栈大小限制为2^14

我使用一次性程序来创build一个程序,以确定我可以传递给一个方法的参数的最大数量。 根据我的实验结果,最接近答案,我可以find以下(所有这些只有在我的电脑上有效):

  1. 包含具有16383个参数的方法的.net应用程序可以编译,运行和调用(!)
  2. 包含16384或更多参数的.net应用程序可以被编译,但运行这样的程序会引发一个未声明的exception。
  3. 包含50000个参数的.net应用程序也可以被编译,但试图运行这样的应用程序会导致抛出StackOverflowException。
  4. 试图编译包含100000个参数或更多的.net应用程序导致csc.exe给出编译时错误,指出由此产生的expression式太长或复杂,无法处理。

除此之外,有没有人有这个问题的明确答案?

PS如果有人想在他们的电脑上尝试这个实验,可以从我的testing程序开始,可以从https://docs.google.com/open?id=0B1Q3uRTkbsXic2cwUFpXanNkSk0