I'm aware that a params
modifier (which turns in one parameter of array type into a so-called "parameter array") is specifically not a part of the method signature. Now consider this example:
class Giraffid
{
public virtual void Eat(int[] leaves)
{
Console.WriteLine("G");
}
}
class Okapi : Giraffid
{
public override void Eat(params int[] leaves)
{
Console.WriteLine("O");
}
}
This compiles with no warnings. Then saying:
var okapi = new Okapi();
okapi.Eat(2, 4, 6); // will not compile!
gives an error(No overload for method 'Eat' takes 3 arguments
).
Now, I know that the compiler translates the params
modifier into an application of the System.ParamArrayAttribute
onto the parameter in question. In general there's no problem in applying one collection of attributes to a parameter of a virtual method, and then decorating the "corresponding" parameter in an overriding method in a derived class with a different set of attributes.
Yet the compiler chooses to ignore my params
keyword silently. Conversely, if one makes it the other way round, and applies params
to the parameter in the base class Giraffid
, and then omits the keyword in the override in Okapi
, the compiler chooses to decorate both methods with the System.ParamArrayAttribute
. I verified these things with IL DASM, of course.
My question:
Is this documented behavior? I have searched thoroughly through the C# Language Specification without finding any mention of this.
I can say that at least the Visual Studio development environment is confused about this. When typing the 2, 4, 6
in the above method call, the intellisense shows me void Okapi.Eat(params int[] leaves)
in a tip.
For comparision, I also tried implementing an interface method and changing the presence/absence of params
in interface and implementing class, and I tried defining a delegate type and changing params
or not in either the delegate type definition or the method whose method group I assigned to a variable of my delegate type. In these cases it was perfectly possible to change params
-ness.
params
is not excluded from list of possible matches. – Higgins