Depende de TypeA
y TypeB
.
- Si exactamente una de ellas es aplicable (por ejemplo, no hay conversión de
null
a TypeB
porque es un tipo de valor, pero TypeA
es un tipo de referencia) y luego se hizo la llamada a la aplicable.
- De lo contrario, depende de la relación entre
TypeA
y TypeB
.
- Si hay una conversión implícita
TypeA
-TypeB
pero no la conversión implícita TypeB
-TypeA
entonces se usará la sobrecarga usando TypeA
.
- Si hay una conversión implícita
TypeB
-TypeA
pero no la conversión implícita TypeA
-TypeB
entonces se usará la sobrecarga usando TypeB
.
- De lo contrario, la llamada es ambigua y no podrá compilarse.
Véase la sección 7.4.3.4 de la especificación C# 3.0 para las modalidades.
Aquí hay un ejemplo de que no es ambiguo. Aquí TypeB
deriva de TypeA
, lo que significa que hay una conversión implícita de TypeB
a TypeA
, pero no al revés. Así, la sobrecarga de uso de TypeB
se utiliza:
using System;
class TypeA {}
class TypeB : TypeA {}
class Program
{
static void Foo(TypeA x)
{
Console.WriteLine("Foo(TypeA)");
}
static void Foo(TypeB x)
{
Console.WriteLine("Foo(TypeB)");
}
static void Main()
{
Foo(null); // Prints Foo(TypeB)
}
}
En general, incluso en la cara de una llamada de otra manera ambigua, para asegurarse de que se utiliza una sobrecarga en particular, simplemente fundido:
Foo((TypeA) null);
o
Foo((TypeB) null);
Tenga en cuenta que si se trata de la herencia en las clases que declaran (es decir una clase está sobrecargando un método declarado por su clase base) que está en un todo otro problema, y usted ne ed para lanzar el objetivo del método en lugar del argumento.
otro para estar al tanto de los métodos está sobrecargado, donde al menos un método que utiliza la palabra clave params. –