c# optional-arguments

¿Me puede explicar este extraño comportamiento de c#con argumentos opcionales?



optional-arguments (1)

Si usa Resharper, le dará la siguiente advertencia / notificación.

"El valor predeterminado del parámetro opcional difiere de la edad del parámetro en el método base void TellYourAge (int age)".

Tenga cuidado cuando mezcle valores de parámetros opcionales y herencia. Los valores predeterminados de los parámetros se resuelven en tiempo de compilación, no en tiempo de ejecución. El valor predeterminado pertenece al tipo de referencia al que se llama. Aquí se resuelve en el tipo de persona y utiliza el valor predeterminado de un número entero que es 0, en lugar de -1.

Puede encontrar información sobre las dificultades comunes relacionadas con los parámetros opcionales aquí:

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

Fácil de arreglar si quieres usarlo de esta manera. Especifique explícitamente la palabra clave ''this'' al llamar al método TellYourAge. De esta manera, el valor predeterminado deseado se determinará en el momento de la compilación.

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

Posible duplicado:
Parámetros opcionales de C # en métodos sobrescritos

Esta es la salida del siguiente código:

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

¿Puede explicarme por qué la llamada de Peter p.TellYourAge() y p.DoSomething() no es idéntica?

Aquí el código para probarlo usted mismo (VS2010 y 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); } }