【发布时间】:2013-06-05 16:48:03
【问题描述】:
好的,回到基础。我想知道如何正确重载带有params 参数的方法。
这是我的场景。我从我的常规方法开始:
public void MyMethod(MyObject mo)
{
// method body
}
我为它创建了一个看起来像这样的重载:
public void MyMethod(MyObject mo, params string[] fields)
{
// new method body
MyMethod(mo);
}
明显的意图是MyMethod(new MyObject()); 执行原始方法,MyMethod(new MyObject(), "field0"/*, etc...*/); 执行重载方法。但我发现情况并非如此。
实际发生的是MyMethod(new MyObject());执行了重载的方法!
我不明白。在这种情况下,我将如何执行原始方法?
用实际代码更新
好的,下面是产生所描述行为的实际代码。
Class1Base.cs:
public class Class1Base
{
public virtual void MyMethod(MyObject ob)
{
Console.WriteLine("Called Class1Base");
}
}
Class1.cs:
public class Class1 : Class1Base
{
public override void MyMethod(MyObject ob)
{
Console.WriteLine("called overridden method");
}
public void MyMethod(MyObject ob, params string[] fields)
{
Console.WriteLine("called OVERLOADED method");
}
}
MyObject.cs:
public class MyObject
{
public int Id { get; set; }
public string Description { get; set; }
}
然后,当我以这种方式执行这段代码时:
var myClass = new Class1();
var myObject = new MyObject();
myClass.MyMethod(myObject);
myClass.MyMethod(null);
myClass.MyMethod(null, "string");
控制台显示:
called OVERLOADED method
called OVERLOADED method
called OVERLOADED method
我希望它会显示:
called overridden method
called overridden method
called OVERLOADED method
为什么不呢?
【问题讨论】:
-
是否可以完全删除旧的重载并将其功能移至新的重载?如您所见,您可以为
params方法提供 0 值,它只会为参数创建一个大小为零的数组。 -
我想这可能是一种选择,但对于更简洁、更可测试的代码,我更愿意使用重载。听起来好像没有办法使用
params关键字来完成这种类型的重载。 -
很好奇。使用“重载”实际上是有道理的,实际上它更像是一种“隐藏”原始文件的方法。我想知道您如何调用原始方法。编译器会对此发出警告吗?
-
@DonBoitnott - 没有编译器警告。
-
我很确定规范说
params方法应该失去重载决议,如果它只适用于它的扩展形式。你确定这是你看到的行为吗?你能告诉我们呼叫站点吗?
标签: c# overloading params-keyword