在给出的示例中(对于代码样式感到遗憾,它符合紧凑自包含的repro的兴趣),所调用的方法始终是B中的虚方法有额外的整数参数,但我期望在C
中实现的方法是一个被调用的方法。C#为可选参数和多级继承选择一种不同的方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MethodChoosing
{
class Program
{
static void Main(string[] args)
{
C c = new C();
c.M();
Console.ReadKey();
}
}
public class A
{
public virtual void M(bool? a = null)
{
Console.WriteLine("base base");
}
}
public class B : A
{
public override void M(bool? a = null)
{
Console.WriteLine("base override");
}
public virtual void M(bool? a = null, int? b = null)
{
Console.Write("base new");
}
}
public class C : B
{
public override void M(bool? a = null)
{
Console.WriteLine("pick me!");
}
}
}
,输出 “新基础”。这显然不是我所期望的行为,是否有人能够解释推理?
编辑: 改变主,使c.M
有一个true或null参数仍然选择不正确的方法。
退房这个问题: http://stackoverflow.com/questions/8909811/c-sharp-optional-parameters-on-overridden-methods它可能不是同样的事情,但它接近。 – 2012-03-27 13:45:20
你已经结合了重载和可选参数。你永远不应该那样做。对于你的犯罪,我判你阅读[Eric Lippert关于可选参数角落案件的四部分系列](http://blogs.msdn.com/b/ericlippert/archive/2011/05/09/optional-argument-corner-cases -part-one.aspx)加上这个[“如果它伤害,那么不要这样做”prequel](http://blogs.msdn.com/b/ericlippert/archive/2011/02/10/optional-arguments - 酮两种-ends.aspx)。 – 2012-03-27 13:46:55
我从来不会这样做,这是一个随机的想法,变成了一些调查:) – 2012-03-27 16:00:47