【发布时间】:2012-08-04 22:45:54
【问题描述】:
在下面的代码中,对 Method2 的调用将 Value 参数接收为 False,即使基类根本没有为参数声明默认值,而派生类将 True 声明为默认值。
可以说(就像这里的类似示例中所做的那样:C# optional parameters on overridden methods)编译器首先使用基类的方法声明(这是真的,因为可以通过在对 Method1 的调用前加上 this. 来改变这种行为) ,但在这种情况下,base 根本没有声明默认值。
对此有合理的解释吗?
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【问题讨论】:
-
这不是我得到的输出。我收到“调用 Method1,预期:True,得到:True 调用 Method2,预期:True,得到:True”。您确定正是您正在运行的代码吗?诚然,我使用的是 C# 5 beta 编译器,所以可能已经修复了……
-
呃- 你确定这是你得到的吗?我面前没有 C# 编译器,但我真的倾向于怀疑它 - 在
Method2的主体中对Method1的调用只能解析为具有默认(true)参数的覆盖副本。编辑:(换句话说,@JonSkeet 所说的 :-)) -
.Net 4.0 我得到了与@andrei 相同的结果。
-
回想起来,我很确定我以前见过这个错误 - 在 Stack Overflow 上报告过,并已针对 C# 5 编译器进行了修复。嗯。
-
@Andrei:我说的是这一段:“确实,情况变得更糟了:如果您在
Derived中为参数提供默认值,但在Base中强制要求,则调用M()最终使用null作为参数值。如果没有别的,我会说这证明这是一个错误:空值不能来自任何有效的地方。(它是null,因为这是默认值string类型的值;它始终只使用参数类型的默认值。)“正是您在讨论的内容。您在基类中有一个强制参数,并且您正在观察参数类型的默认值
标签: c# .net overriding virtual optional-parameters