【发布时间】:2017-09-08 02:09:17
【问题描述】:
我注意到在使用具有可选参数的虚拟方法时。当您覆盖此方法并为可选参数使用不同的默认值时,它使用原始值。我觉得有点奇怪。
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
但它会返回
1
4
这意味着它们都是假的。我什至可以将参数重命名为不同的名称,并在方法主体中使用不同的名称,它的行为仍然相同。哪个告诉我默认参数值不能被覆盖,因为这是合同的一部分?显然,如果我将项目转换为 Pawn 对象,然后调用 GetPos(),它会返回 3 而不是 4。
我只是觉得这很有趣,因为我预计它的行为会有所不同。我只是想知道我是否遗漏了任何东西来使这项工作按我的初衷进行。
【问题讨论】:
-
感觉我必须回答这个问题。您找到了 C# 团队非常不愿意添加对可选参数的支持的原因之一。他们最终屈服于第 4 版,该版本大大改进了对 COM 的支持。可选参数在 Office 等 COM 对象模型中非常常见。但是多态性确实使它成为一个泄漏的抽象,一个 COM 没有的特性,编译器只是不知道在运行时将调用哪个方法。它只能根据它所知道的东西工作,它知道 Piece。
标签: c# overriding virtual