Buscar..


Observaciones

El proceso de resolución de sobrecarga se describe en la especificación C # , sección 7.5.3. También son relevantes las secciones 7.5.2 (inferencia de tipo) y 7.6.5 (expresiones de invocación).

La forma en que funciona la resolución de sobrecarga probablemente se modificará en C # 7. Las notas de diseño indican que Microsoft lanzará un nuevo sistema para determinar qué método es mejor (en escenarios complicados).

Ejemplo de sobrecarga básica

Este código contiene un método sobrecargado llamado Hello :

class Example
{
    public static void Hello(int arg)
    {
        Console.WriteLine("int");
    }
 
    public static void Hello(double arg)
    {
        Console.WriteLine("double");
    }
 
    public static void Main(string[] args) 
    {
        Hello(0);
        Hello(0.0);
    }
}

Cuando se llama al método principal , se imprimirá

int
double

En tiempo de compilación, cuando el compilador encuentra el método llamado Hello(0) , encuentra todos los métodos con el nombre Hello . En este caso, encuentra dos de ellos. Luego trata de determinar cuál de los métodos es mejor . El algoritmo para determinar qué método es mejor es complejo, pero generalmente se reduce a "hacer la menor cantidad posible de conversiones implícitas".

Por lo tanto, en el caso de Hello(0) , no se necesita conversión para el método Hello(int) pero se necesita una conversión numérica implícita para el método Hello(double) . Así, el primer método es elegido por el compilador.

En el caso de Hello(0.0) , no hay forma de convertir 0.0 a int implícita, por lo que el método Hello(int) ni siquiera se considera para la resolución de sobrecarga. Sólo queda el método y así lo elige el compilador.

"params" no se expande, a menos que sea necesario.

El siguiente programa:

class Program
{
    static void Method(params Object[] objects)
    {
        System.Console.WriteLine(objects.Length);
    }   
    static void Method(Object a, Object b)
    {
        System.Console.WriteLine("two");
    }
    static void Main(string[] args)
    {
        object[] objectArray = new object[5];

        Method(objectArray);
        Method(objectArray, objectArray);
        Method(objectArray, objectArray, objectArray);
    }
}

imprimirá:

5
two
3

El Method(objectArray) expresión de llamada Method(objectArray) se puede interpretar de dos maneras: un solo argumento de Object que resulta ser una matriz (por lo que el programa generaría 1 porque ese sería el número de argumentos, o como una matriz de argumentos, dados en la forma normal, como si el método Method no tuviera la palabra clave params . En estas situaciones, la forma normal no expandida siempre tiene prioridad. Por lo tanto, el programa produce 5 .

En la segunda expresión, Method(objectArray, objectArray) tanto la forma expandida del primer método como el segundo método tradicional. También en este caso, las formas no expandidas tienen prioridad, por lo que el programa imprime two .

En la tercera expresión, Method(objectArray, objectArray, objectArray) , la única opción es usar la forma expandida del primer método, y así se imprime el programa 3 .

Pasando nulo como uno de los argumentos.

Si usted tiene

void F1(MyType1 x) {
    // do something
}

void F1(MyType2 x) {
    // do something else
}

y por alguna razón, debe llamar a la primera sobrecarga de F1 pero con x = null , y luego hacerlo simplemente

F1(null);

No compilará ya que la llamada es ambigua. Para contrarrestar esto puedes hacer

F1(null as MyType1);


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow