c# 虚方法和重写方法中的可选参数

c# Optional Parameters in a virtual method and overridden method

我注意到在使用具有可选参数的虚拟方法时。当您覆盖此方法并为可选参数使用不同的默认值时,它会使用原始值。我觉得有点奇怪。

static void Main(string[] args)
{
     List<Piece> Pieces = new List<Piece>();
     Pieces.Add(new Piece());
     Pieces.Add(new Pawn());
     foreach(var v in Pieces)
     {
         Console.WriteLine(v.getPos());
     }
     Console.ReadKey();
}


class Piece
{
    public virtual long getPos(bool enPassant = false)
    {
        if (enPassant)
            return 2;

        return 1;
    }
}


class Pawn:Piece
{
    public override long getPos(bool enPassant = true)
    {
        if (enPassant)
            return 3;

        return 4;
    }
}

最初我希望输出是

1
3

但是returns

1
4

这意味着它们都是假的。我什至可以将参数重命名为不同的名称,并在方法主体中使用不同的名称,它的行为仍然相同。这告诉我不能覆盖默认参数值,因为这是合同的一部分?显然,如果我将项目投射到 Pawn 对象,然后调用 GetPos() 它 returns 3 而不是 4。

我只是觉得这很有趣,因为我希望它的行为有所不同。我只是想知道我是否遗漏了任何东西来使这项工作按我最初的意图进行。

我确实认为这是因为触发器。 你做了 v.getPos();没有布尔值。 因为没有插入 bool 我认为它的值是标准的 false 并且返回 4 istead.

可选参数在编译时在调用点解析

这意味着 v.GetPos() 确实被编译为 v.GetPos(false) 因为 v 被键入 Piece。调用是虚拟的并最终被解析为 Pawn.GetPos(bool) 这一事实是无关紧要的,这种情况发生在 之后 已经设置了可选参数。

这就是您获得所见输出的原因。