C# 重写方法中的默认参数值
在下面的代码中,对Method2的调用将值参数接收为False,即使基类根本没有为参数声明默认值,而派生类将True声明为默认值。C# 重写方法中的默认参数值,c#,.net,overriding,virtual,optional-parameters,C#,.net,Overriding,Virtual,Optional Parameters,在下面的代码中,对Method2的调用将值参数接收为False,即使基类根本没有为参数声明默认值,而派生类将True声明为默认值。 可以认为(就像在这里的类似示例中所做的那样:)编译器首先使用基类的方法声明(这是正确的,因为可以通过在调用Method1之前加上this.)来更改此行为),但在这种情况下,基类根本不声明默认值。 对此有合理的解释吗 using System; class Base { public virtual bool Method1(bool Value) { re
可以认为(就像在这里的类似示例中所做的那样:)编译器首先使用基类的方法声明(这是正确的,因为可以通过在调用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());
}
}
输出:
Call to Method1, expected: True, got: True
Call to Method2, expected: True, got: False
调用Method1,应为:True,已为:True
调用Method2,应为:True,已为:False
看起来这是一种bug 这是你们谈论的链接,我想是今年早些时候的链接:
您的问题似乎与另一个问题相关,这可能会对您有所帮助:我刚刚安装了Visual Studio 2012 RTM,即使在为Framework 3.5或2.0编译时,同样的代码也能正常工作。
显然,这是一个编译器问题,而不是.Net Framework问题,并且在新版本的C#编译器中得到了修复。这不是我得到的输出。我得到“调用Method1,预期:True,get:True调用Method2,预期:True,get:True”。你确定这就是你正在运行的代码吗?诚然,我使用的是C#5测试版编译器,所以可能已经修复了…呃-你确定这就是你得到的吗?我面前没有C#编译器,但我真的倾向于怀疑它,
Method2
主体中对Method1
的调用只能解析为带有默认(true)参数的重写副本。EDIT:(换句话说,@JonSkeet说的:-).NET4.0,我得到了与@andrei相同的结果。回想起来,我很确定我以前见过这个错误-在这里报告了堆栈溢出,并修复了C#5编译器。嗯。@Andrei:我说的是这一段:“事实上,情况变得更糟了:如果你在Derived
中为参数提供一个默认值,但在Base
中将其设为强制值,那么调用m()
最终使用null
作为参数值。如果没有其他东西,我会说这证明了这是一个错误:null值不能来自任何有效的地方。(它是null
,因为它是字符串
类型的默认值;它总是只使用参数类型的默认值。)”正是你在讨论的。您在基类中有一个强制参数,并且您正在观察参数typeNo的默认值,它不相关,即使表面上看起来有些类似,请参见该问题的答案。