No entiendo por qué el compilador no puede resolver la sobrecarga correcta para usar aquí. (código a continuación) Solo hay una versión de Add() que es apropiada: BigFoo es un IFoo y no implementa IEnumerable donde T es un IFoo. Pero insiste en informar una ambigüedad. ¿Algunas ideas? Intenté agregar un segundo parámetro de tipo genérico: Agregar donde T: IFoo donde U: IEnumerable. Pero luego la sobrecarga se ignora por completo, incluso para uso legítimo.Sobrecarga genérica de C#: el compilador no puede determinar la llamada correcta
Sé que puedo solucionar esto con el casting y la especificación de parámetros de tipo genéricos, pero en ese punto he vencido el propósito de tener una sobrecarga. Podría cuestionar la sobrecarga, pero la semántica me parece correcta: el comportamiento que estoy implementando en mi clase es que Add() agregue el objeto al por mayor como una entrada individual en la colección. (No se supone que la segunda Agregar() para ser un AddRange().)
namespace NS
{
interface IFoo { }
class BigFoo : IFoo, IEnumerable<int>
{
public IEnumerator<int> GetEnumerator()
{
throw new NotImplementedException();
}
IEnumerator IEnumerable.GetEnumerator()
{
throw new NotImplementedException();
}
}
class FooContainer
{
public void Add(IFoo item) { }
public void Add<T>(IEnumerable<T> group) where T : IFoo { }
}
class DemoClass
{
void DemoMethod()
{
BigFoo bigFoo = new BigFoo();
FooContainer fooContainer = new FooContainer();
// error CS0121: The call is ambiguous between the following methods or properties:
// 'NS.FooContainer.Add(NS.IFoo)' and
// 'NS.FooContainer.Add<int>(System.Collections.Generic.IEnumerable<int>)'
fooContainer.Add(bigFoo);
}
}
}
Jeff Richter está de acuerdo "el compilador de C# prefiere una asociación más explícita durante un partido genérico" Display ("Jeff") se correspondería con Display (String) Visualización (T) sólo se –
Gishu
Las reglas de desempate aplican si los tipos de parámetros formales son IDENTICOS. Por ejemplo, si tiene M (int x) y M (T t), entonces el primero es mejor que M (int t). –
Ah, gracias Eric. Es bueno tener la especificación en línea y contribuir;) editará apropiadamente. –