J'ai une classe générique pour laquelle j'essaie d'implémenter un casting de type implicite. Bien que cela fonctionne en général, cela ne fonctionne pas pour le casting d'interface. Après une enquête plus approfondie, j'ai découvert qu'il y a une erreur de compilation : "Conversion définie par l'utilisateur à partir d'une interface" qui s'applique. Bien que je comprenne que cela devrait être appliqué dans certains cas, ce que j'essaie de faire semble être un cas légitime.
Voici un exemple :
public class Foo<T> where T : IBar
{
private readonly T instance;
public Foo(T instance)
{
this.instance = instance;
}
public T Instance
{
get { return instance; }
}
public static implicit operator Foo<T>(T instance)
{
return new Foo<T>(instance);
}
}
Code pour l'utiliser :
var concreteReferenceToBar = new ConcreteBar();
IBar intefaceReferenceToBar = concreteReferenceToBar;
Foo<ConcreteBar> concreteFooFromConcreteBar = concreteReferenceToBar;
Foo<IBar> fooFromConcreteBar = concreteReferenceToBar;
Foo<IBar> fooFromInterfaceBar = intefaceReferenceToBar; // doesn't work
Quelqu'un connaît-il une solution de contournement ou peut-il expliquer de manière satisfaisante pourquoi je ne devrais pas être en mesure de faire des castings ? interfaceReferenceToBar
implicitement à Foo<IBar>
puisque, dans mon cas, il n'est pas converti, mais seulement contenu dans Foo ?
EDIT : On dirait que la covariance pourrait offrir le salut. Espérons que la spécification C# 4.0 permette le casting implicite des types d'interface en utilisant la covariance.