我知道一个params
修饰符(将数组类型的一个参数转换为所谓的“参数数组”)特别不是方法签名的一部分。现在考虑这个例子:
class Giraffid
{
public virtual void Eat(int[] leaves)
{
Console.WriteLine("G");
}
}
class Okapi : Giraffid
{
public override void Eat(params int[] leaves)
{
Console.WriteLine("O");
}
}
编译时没有任何警告。然后说:
var okapi = new Okapi();
okapi.Eat(2, 4, 6); // will not compile!
给出一个错误(No overload for method 'Eat' takes 3 arguments
).
现在,我知道编译器会翻译params
修改器到应用程序中System.ParamArrayAttribute
到有问题的参数上。一般来说,将一组属性应用于虚拟方法的参数,然后使用一组不同的属性装饰派生类中的重写方法中的“相应”参数,这是没有问题的。
然而编译器选择忽略我的params
默默地关键词。相反,如果反过来,并应用params
到基类中的参数Giraffid
,然后省略覆盖中的关键字Okapi
,编译器选择装饰both方法与System.ParamArrayAttribute
。当然,我用 IL DASM 验证了这些事情。
我的问题:
这是有记录的行为吗?我彻底搜索了 C# 语言规范,但没有找到任何提及这一点的内容。
我可以说至少Visual Studio开发环境对此感到困惑。当输入2, 4, 6
在上面的方法调用中,智能感知向我展示void Okapi.Eat(params int[] leaves)
在提示中.
为了进行比较,我还尝试实现接口方法并更改存在/不存在params
在接口和实现类中,我尝试定义委托类型并更改params
或者不在委托类型定义或我将其方法组分配给委托类型的变量的方法中。在这些情况下,完全有可能改变params
-ness.