你能给我解释一下c#的这种奇怪行为吗?

你能给我解释一下c#的这种奇怪行为吗?,c#,optional-arguments,C#,Optional Arguments,可能重复: 这是以下代码的输出: Peter: -1 Peter: 0 Fred: 1 Fred: 1 你能解释一下为什么Peterp.TellYourAge()和p.DoSomething()的调用不一样吗 下面是自己尝试的代码(VS2010和FW 4): 如果您碰巧使用了Resharper,它将给您以下警告/通知 “可选参数默认值与基本方法void TellYourAge(int-age)中的参数age不同。” 混合使用可选参数值和继承时要小心。默认参数值在编译时解析,而不是在运行时解析

可能重复:

这是以下代码的输出:

Peter: -1
Peter: 0
Fred: 1
Fred: 1
你能解释一下为什么Peter
p.TellYourAge()
p.DoSomething()
的调用不一样吗

下面是自己尝试的代码(VS2010和FW 4):


如果您碰巧使用了Resharper,它将给您以下警告/通知

“可选参数默认值与基本方法void TellYourAge(int-age)中的参数age不同。”

混合使用可选参数值和继承时要小心。默认参数值在编译时解析,而不是在运行时解析。默认值属于正在调用的引用类型。在这里,它解析为Person类型,并使用整数的默认值0,而不是-1

您可以在此处找到有关可选参数的常见陷阱的一些信息:

如果您想以这种方式使用,请轻松修复。调用TellYourAge方法时显式指定关键字“this”。这样,所需的默认值将在编译时确定

public void DoSomething()
{
    this.TellYourAge();
}

我的第一个猜测是,由于int在这里不可为null:public override void TellYourAge(int age=-1)//使用默认值进行覆盖,它的默认值总是0…@mservidio,但这就是为什么您指定Eric Lippert可能感兴趣的默认值。虽然它没有描述完全相同的情况,但它应该会为您提供一些关于发生了什么的线索。打开Resharper/ILSpy,看看编译了什么。在这种情况下,我希望会出现编译错误或警告,但这不是重点。默认参数是在编译时解析的,这一点也很清楚,但这并不能解释为什么在p-instance上调用完全相同的TellYourAge()会导致不同的输出。请参阅,这些主题是相关的,但不是重复的。在另一种情况下,使用指定的默认值。在本例中,使用了该类型未指定的默认值。@X181我相信这是同一个编译器错误。JonSkeet对旧问题的回答甚至测试了这种情况,其中基类有一个强制参数。
public void DoSomething()
{
    this.TellYourAge();
}