Je viens de me lancer dans ce que je pense être une bizarrerie dans le moulage de types. J'ai un code similaire à ce qui suit:C# Type impair de coulée de type - interface comme type générique
interface IMyClass { }
class MyClass: IMyClass { }
class Main
{
void DoSomething(ICollection<IMyClass> theParameter) { }
HashSet<MyClass> FillMyClassSet()
{
//Do stuff
}
void Main()
{
HashSet<MyClass> classSet = FillMyClassSet();
DoSomething(classSet);
}
}
Quand il arrive à DoSomething (classSet), le compilateur se plaint qu'il ne peut pas jeter HashSet <MyClass> à ICollection <IMyClass>. Pourquoi donc? HashSet implémente ICollection, MyClass implémente IMyClass, alors pourquoi la distribution n'est-elle pas valide? Incidemment, ce n'est pas difficile à contourner, j'ai pensé que c'est un peu gênant.
void Main()
{
HashSet<MyClass> classSet = FillMyClassSet();
HashSet<IMyClass> interfaceSet = new HashSet<IMyClass>();
foreach(IMyClass item in classSet)
{
interfaceSet.Add(item);
}
DoSomething(interfaceSet);
}
Pour moi, le fait que cela fonctionne rend l'impossibilité de lancer encore plus mystérieux.
@ Mehrdad a votre réponse quant à pourquoi. Mais au lieu de 'foreach', ne pouvez-vous pas simplement changer le type de retour de' FillMyClassSet() 'à' HashSet '? –
JMD