Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the maximum number of parameters that a C# method can be defined as taking?

Tags:

c#

.net

clr

I am trying to figure out what the maximum number of parameters a method in C# can have. I've checked everywhere for an answer, including the C# official documentation, MSDN, and a couple of CLR references and I can't find an answer. Does anyone have an answer to this question?

like image 368
rmiesen Avatar asked Sep 30 '12 05:09

rmiesen


People also ask

What is the maximum limit on the number of parameters in C programming language?

Thanks! as I know (and your first link says) the limit is 256 arguments in c++ and 127 in c. The line length is no problem since you can break a line into more lines.

What is the maximum number of parameters?

The maximum number of parameters is limited to 126 by functions.

What is the maximum number of parameters that can be passed to the Keydown function?

they say that - 255 parameters...

What is the maximum number of parameters accepted by open?

— Parameters in one macro definition [256].


2 Answers

I used a throwaway program to create a program to determine the maximum number of parameters I can pass to a method. Based on the results of my experimentation, the closest to an answer I can find are the following (all of which is only valid on my computer):

  1. A .net application containing a method with 16383 parameters can be compiled, ran, and called (!)
  2. A .net application containing 16384 or more parameters can be compiled, but running such a program throws an unstated exception.
  3. A .net application containing 50000 parameters can also be compiled, but attempting to run such an application results in a StackOverflowException being thrown.
  4. Attempting to compile a .net application containing 100000 parameters or more results in csc.exe giving a compile-time error, stating that the resulting expression is too long or complex to handle.

Aside from that, does anyone have a definitive answer to this question?

P.S. If anyone wants to try this experiment on their computer, you can start with my test program, which can be downloaded https://docs.google.com/open?id=0B1Q3uRTkbsXic2cwUFpXanNkSk0

like image 125
rmiesen Avatar answered Sep 20 '22 05:09

rmiesen


Here is your theoretical answer:

In order to push method arguments onto the stack, compiled code has the following MSIL opcodes to choose from:

ldarg.0

ldarg.1

ldarg.2

ldarg.3

ldarg.S

ldarg

ldarg.0 to ldarg.3 is used to push the first 4 method arguments onto the stack (including this as the first argument for instance methods).

ldarg.S takes an 8-bit argument number, and so it can be used to push up to 256 arguments onto the stack.

That leaves us with plain old ldarg, which can handle the most method arguments: it takes an unsigned 16-bit argument number, so the largest number of arguments that can be successfully compiled into valid MSIL is 2^16 = 65,536.

As others have noted, however, the actual limit will depend on implementation details of the runtime. Based on rmiesen's answer, it looks like the current .NET implementation limits the maximum number of parameters to 2^14.

like image 22
Mike Marynowski Avatar answered Sep 21 '22 05:09

Mike Marynowski