6

Estaba pasando por una presentación sobre C# 4.0 y al final el presentador publicó una prueba con el siguiente código.C# Parámetros con nombre, Herencia y sobrecarga sorpresa

using System; 
class Base { 
    public virtual void Foo(int x = 4, int y = 5) { 
        Console.WriteLine("B x:{0}, y:{1}", x, y); 
    } 
} 

class Derived : Base { 
    public override void Foo(int y = 4, int x = 5) { 
        Console.WriteLine("D x:{0}, y:{1}", x, y); 
    } 
} 

class Program { 
    static void Main(string[] args) { 
        Base b = new Derived(); 
        b.Foo(y:1,x:0); 
    } 
} 

// The output is 
// D x:1, y:0 

yo no podía entender por qué se produce esa salida (problema de la lectura de la presentación fuera de línea sin el presentador). Esperaba

D x:0, y:1 

Realicé búsquedas en la red para encontrar la respuesta, pero seguí sin poder encontrarla. ¿Puede alguien explicar esto?

+0

Esto no tiene nada que ver con los parámetros nombrados. Aprende qué es el polimorfismo. –

+0

El problema es que cualquier desarrollador esperaría que se llamara Derived.Foo debido a un polimorfismo. Por lo tanto, es normal que alguien piense que se tomarán los parámetros nombrados en el Derived.Foo. Pero como se trata de un compilador de polimorfismo en tiempo de ejecución, utiliza los nombres de los parámetros de Base.Foo. – ferosekhanj

Respuesta

3

El motivo parece ser el siguiente: Usted está llamando al Foo en Base, por lo que toma los nombres de los parámetros de Base.Foo. Como x es el primer parámetro y y es el segundo parámetro, este orden se utilizará al pasar los valores al método modificado.