在給出的示例中(對於代碼樣式感到遺憾,它符合緊湊自包含的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