17

可能重复:
覆盖方法上的 C# 可选参数

这是以下代码的输出:

Peter: -1
Peter: 0
Fred: 1
Fred: 1

你能解释一下为什么彼得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);
    }
}
4

1 回答 1

3

如果您碰巧使用 Resharper,它会给您以下警告/通知。

“可选参数默认值与基本方法 void TellYourAge(int age) 中的参数年龄不同。”

当你混合可选参数值和继承时要小心。默认参数值在编译时解析,而不是运行时解析。默认属于被调用的引用类型。这里它解析为 Person 类型,它使用整数的默认值 0,而不是 -1。

您可以在此处找到有关可选参数的常见陷阱的一些信息:

http://geekswithblogs.net/BlackRabbitCoder/archive/2010/06/17/c-optional-parameters---pros-and-pitfalls.aspx

如果您想以这种方式使用它,请轻松修复。在调用方法 TellYourAge 时显式指定关键字“this”。这样,所需的默认值将在编译时确定。

public void DoSomething()
{
    this.TellYourAge();
}
于 2012-03-05T15:38:47.953 回答