Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重写方法中的默认参数值_C#_.net_Overriding_Virtual_Optional Parameters - Fatal编程技术网

C# 重写方法中的默认参数值

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

在下面的代码中,对Method2的调用将值参数接收为False,即使基类根本没有为参数声明默认值,而派生类将True声明为默认值。
可以认为(就像在这里的类似示例中所做的那样:)编译器首先使用基类的方法声明(这是正确的,因为可以通过在调用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的默认值,它不相关,即使表面上看起来有些类似,请参见该问题的答案。