Можете ли вы объяснить мне это странное поведение С# с необязательными аргументами? - программирование
Подтвердить что ты не робот

Можете ли вы объяснить мне это странное поведение С# с необязательными аргументами?

Возможный дубликат:
Дополнительные параметры С# для переопределенных методов

Это вывод следующего кода:

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

Можете ли вы объяснить мне, почему вызов Peter 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);
    }
}
4b9b3361

Ответ 1

Если вы используете Resharper, он предоставит вам следующее предупреждение/уведомление.

"Дополнительное значение параметра по умолчанию отличается от возраста параметра в базовом методе void TellYourAge (int age)."

Посмотрите, когда вы смешиваете необязательные значения параметров и наследование. Значения параметров по умолчанию разрешаются во время компиляции, а не во время выполнения. По умолчанию используется вызываемый ссылочный тип. Здесь он разрешает тип Person и использует значение по умолчанию для целого числа, которое равно 0, а не -1. ​​

Здесь вы можете найти информацию об общих ошибках относительно необязательных параметров:

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

Легко исправить, если вы хотите использовать его таким образом. Явно укажу ключевое слово 'this' при вызове метода TellYourAge. Таким образом, желаемое значение по умолчанию будет определено во время компиляции.

public void DoSomething()
{
    this.TellYourAge();
}