Je ne comprends pas pourquoi le compilateur ne peut pas résoudre la surcharge correcte à utiliser ici. (code ci-dessous) Il y a seulement une version de Add() qui est appropriée - BigFoo est un IFoo, et n'implémente pas IEnumerable où T est un IFoo. Mais il insiste pour signaler une ambiguïté. Des idées? J'ai essayé d'ajouter un deuxième paramètre de type générique - Ajouter où T: IFoo où U: IEnumerable. Mais alors la surcharge est complètement ignorée, même pour un usage légitime. Je sais que je peux contourner ce problème avec le lancement et la spécification des paramètres de type génériques, mais à ce moment-là, j'ai vaincu le but d'avoir une surcharge. Vous pourriez remettre en question la surcharge, mais la sémantique me semble correcte - le comportement que j'applique dans ma classe est à la fois pour Add() d'ajouter l'objet en gros comme une entrée individuelle dans la collection. (Le second Ajouter() n'est pas censé être un AddRange().)Surcharge générique C# - Le compilateur ne peut pas déterminer l'appel correct
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 accepte "le compilateur C# préfère un match plus explicite sur un modèle générique correspondant" Display ("Jeff") correspondrait à l'affichage (String) Affichage (T) –
Gishu
Les règles de bris d'égalité ne s'appliquent pas si les types de paramètres formels sont IDENTICAL. Par exemple, si vous avez M (int x) et M (T t) alors le premier est meilleur que M (int t). –
Ah, merci Eric. Il est bon d'avoir la spécification en ligne et de contribuer;) Éditera de manière appropriée. –