Ma non-compiler le code est similaire à ceci:
public abstract class A { }
public class B { }
public class C : A { }
public interface IFoo<T>
{
void Handle(T item);
}
public class MyFoo<TA> : IFoo<TA>, IFoo<B>
where TA : A
{
public void Handle(TA a) { }
public void Handle(B b) { }
}
Le compilateur C# refuse de compiler ce, en citant la règle suivante/erreur:
'MyProject.MyFoo<TA>' ne peut pas mettre en œuvre à la fois " MyProject.IFoo<TA> " et " MyProject.IFoo<Monprojet.B>', parce qu'ils peuvent unifier pour certains type de paramètre de substitution
Je comprends ce que cette erreur signifie; si TA
pourrait être n'importe quoi à tous, alors il pourrait techniquement être aussi un B
qui serait d'introduire de l'ambiguïté sur les deux Handle
des implémentations.
Mais TA peut pas être quoi que ce soit. En fonction du type de hiérarchie, TA
ne peut pas être un B
- au moins, je ne pense qu'il peut. TA
doit découler A
, ce qui n'est pas dériver de l' B
, et, évidemment, il n'y a pas plusieurs héritage de classe en C#/.NET.
Si je supprime le paramètre générique et remplacez - TA
avec C
, ou même A
, il compile.
Alors, pourquoi ne j'obtiens cette erreur? Est-ce un bug ou général des nations-unies à l'intelligence du compilateur, ou est-il autre chose que je suis absent?
Est-il une solution ou suis-je tout simplement allez avoir à re-mettre en œuvre l' MyFoo
classe générique comme un espace non-classe générique pour chaque possible TA
type dérivé?