Pourquoi le composant ci-dessous ne compilera-t-il pas? Quelle est la particularité de l'interface qui pousse le compilateur à penser qu'il ne peut pas passer de Container<T>
à T
, alors que T
est une interface? Je ne pense pas que ce soit une question covariante, car je ne suis pas downcasting, mais c'est peut-être le cas. C'est un peu comme Why C# compiler doesn't call implicit cast operator? mais je ne pense pas que ce soit pareil.La conversion implicite générique C# sur l'interface a échoué
Product pIn =null;
Product pOut;
Container<Product> pContainer;
List<Product> pListIn = null;
List<Product> pListOut;
Container<List<Product>> pListContainer;
IList<Product> pIListIn = null;
IList<Product> pIListOut;
Container<IList<Product>> pIListContainer;
pContainer = pIn;
pOut = pContainer; // all good
pListContainer = pListIn;
pListOut = pListContainer; // all good too
pIListContainer = pIListIn; // fails , cant do implicit cast for some reason
pIListOut = pIListContainer; // and here too
class Container<T>
{
private T value;
private Container(T item) { value = item; }
public static implicit operator Container<T>(T item)
{
return new Container<T>(item);
}
public static implicit operator T(Container<T> container)
{
return container.value;
}
}
Cannot implicitly convert type 'Container<IList<Product>>' to 'IList<Product>'. An explicit conversion exists (are you missing a cast?)
Cannot implicitly convert type 'IList<Product>' to 'Container<IList<Product>>'. An explicit conversion exists (are you missing a cast?)
+1 - Intéressant en fait. Curieux de voir la réponse. – Lucero
+1 - J'ai trouvé cette erreur de compilation et je voulais poser cette question! – TDaver