me acaba de golpear una situación en la que un despacho método era ambigua y se preguntó si alguien podría explicar en qué se basa el compilador (.NET 4.0.30319) elige lo sobrecargue llamarC# Genérico método sobrecargado despachar ambigua
interface IfaceA
{
}
interface IfaceB<T>
{
void Add(IfaceA a);
T Add(T t);
}
class ConcreteA : IfaceA
{
}
class abstract BaseClassB<T> : IfaceB<T>
{
public virtual T Add(T t) { ... }
public virtual void Add(IfaceA a) { ... }
}
class ConcreteB : BaseClassB<IfaceA>
{
// does not override one of the relevant methods
}
void code()
{
var concreteB = new ConcreteB();
// it will call void Add(IfaceA a)
concreteB.Add(new ConcreteA());
}
En cualquier caso, ¿por qué el compilador no me advierte o incluso por qué compila? Muchas gracias por cualquier respuesta.
¿Qué sucede si espera un valor de retorno de la llamada, es decir, 'var result = concreteB.Add (new ConcreteA());'? –
Porque su Método genérico tiene un "Tipo T" de retorno y el otro es de tipo "vacío". El compilador puede diferenciar entre ellos. – KroaX
el compilador se quejará de que 'var' no se puede usar, porque no puede asignar el vacío a la variable implícitamente tipada – Sebastian