X18*_*181 17 c# optional-arguments
可能重复:
重写方法的C#可选参数
这是以下代码的输出:
Peter: -1
Peter: 0
Fred: 1
Fred: 1
Run Code Online (Sandbox Code Playgroud)
你能解释我为什么彼得的号召p.TellYourAge(),并p.DoSomething()是不相同?
这里是自己尝试的代码(VS2010和FW 4):
static void Main(string[] args)
{
Peter p = new Peter();
p.TellYourAge(); // expected -1, result: -1
p.DoSomething(); // expected -1, result: 0
Fred f = new Fred();
f.TellYourAge(1); // expected 1, result: 1
f.DoSomething(); // expected 1, result: 1
Console.ReadKey();
}
}
public abstract class Person
{
public abstract void TellYourAge(int age); // abstract method without default value
}
public class Peter : Person
{
public override void TellYourAge(int age = -1) // override with default value
{
Console.WriteLine("Peter: " + age);
}
public void DoSomething()
{
TellYourAge();
}
}
public class Fred : Person
{
public override void TellYourAge(int age) // override without default value
{
Console.WriteLine("Fred: " + age);
}
public void DoSomething()
{
TellYourAge(1);
}
}
Run Code Online (Sandbox Code Playgroud)
如果您碰巧使用 Resharper,它会给您以下警告/通知。
“可选参数默认值与基本方法 void TellYourAge(int Age) 中的参数 Age 不同。”
当混合可选参数值和继承时要小心。默认参数值在编译时而不是运行时解析。默认值属于被调用的引用类型。这里它解析为 Person 类型,并使用整数的默认值 0,而不是 -1。
您可以在此处找到有关可选参数的常见陷阱的一些信息:
如果您想以这种方式使用它,很容易修复。调用 TellYourAge 方法时显式指定关键字“this”。这样,所需的默认值将在编译时确定。
public void DoSomething()
{
this.TellYourAge();
}
Run Code Online (Sandbox Code Playgroud)