在下面的代码中,调用Method2方法时,即使基类根本没有声明参数的默认值,派生类却声明了True作为默认值,Value参数也被传递为False。
可以认为(就像在类似的例子C# optional parameters on overridden methods中所做的那样)编译器首先使用基类的方法声明(这是正确的,因为可以通过在对Method1的调用之前加上
对此有合理的解释吗?
可以认为(就像在类似的例子C# optional parameters on overridden methods中所做的那样)编译器首先使用基类的方法声明(这是正确的,因为可以通过在对Method1的调用之前加上
this.
来更改此行为),但在这种情况下,基类根本没有声明默认值。
对此有合理的解释吗?
using System;
class Base
{
public virtual bool Method1(bool Value) { return true; }
public virtual bool Method2(bool Value) { return true; }
}
class Derived : Base
{
public override bool Method1(bool Value = true)
{
return Value;
}
public override bool Method2(bool Value = true)
{
return Method1();
}
}
class Program
{
static void Main(string[] args)
{
Derived a = new Derived();
Console.WriteLine("Call to Method1, expected: True, got: {0}", a.Method1());
Console.WriteLine("Call to Method2, expected: True, got: {0}", a.Method2());
}
}
输出结果:
调用Method1,期望值为:True,实际值为:True 调用Method2,期望值为:True,实际值为:False
Method2
体内对Method1
的调用只能解析为带有默认(true)参数的重写副本。编辑:(换句话说,就是@JonSkeet所说的那样:-)) - Chris ShainDerived
中为参数提供了默认值,但在Base
中将其设为必填项,则调用M()
最终会使用null
作为参数值。如果没有其他问题,我会说这证明了它是一个错误:那个null
值不能来自任何有效的地方。(这是由于string
类型的默认值是null
;它总是只使用参数类型的默认值。)” 这正是你正在讨论的内容。你在基类中有一个必填参数,并且你观察到了参数类型的默认值。 - Ben Voigt