gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:18:41 24 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

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

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

关于c# 虚方法和重写方法中的可选参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43367088/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com