Non capisco perché il compilatore non possa risolvere il sovraccarico corretto da usare qui. (codice di seguito) Esiste solo una versione di Add() appropriata: BigFoo è un IFoo e non implementa IEnumerable dove T è un IFoo. Ma insiste nel riferire un'ambiguità. Qualche idea? Ho provato ad aggiungere un secondo parametro di tipo generico: Aggiungi dove T: IFoo dove U: IEnumerable. Ma poi il sovraccarico è completamente ignorato anche per uso legittimo.C# overload generico - Il compilatore non può determinare la chiamata corretta
So che posso aggirare questo problema con il cast e specificando parametri di tipo generico ma a quel punto ho sconfitto lo scopo di avere un sovraccarico. Potresti mettere in discussione il sovraccarico, ma la semantica mi sembra corretta: il comportamento che sto implementando nella mia classe è che sia per Add() sia per aggiungere l'oggetto all'ingrosso come una singola voce nella raccolta. (Il secondo add() non dovrebbe essere 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 concorda "il compilatore C# preferisce un match più esplicito nel corso di un incontro generico" Display ("Jeff") sarebbe partita Display (String) su display (T) si applicano solo –
Gishu
Le regole tie-breaking se i tipi di parametri formali sono IDENTICI. Ad esempio, se si ha M (int x) e M (T t), il primo è migliore di M (int t). –
Ah, grazie Eric. È bello avere le specifiche online e contribuire;) Modificherà in modo appropriato. –