opérateur implicite utilisant des interfaces

J’ai une classe générique que j’essaie d’implémenter pour un casting de type implicite. Bien que cela fonctionne principalement, cela ne fonctionnera pas pour le casting d’interface. Après un examen plus approfondi, j’ai constaté une erreur du compilateur: “Conversion définie par l’utilisateur à partir de l’interface” qui s’applique. Bien que je comprenne que cela devrait être appliqué dans certains cas, ce que j’essaie de faire semble être une affaire légitime.

Voici un exemple:

public class Foo 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 instance) { return new Foo(instance); } } 

Code pour l’utiliser:

 var concreteReferenceToBar = new ConcreteBar(); IBar intefaceReferenceToBar = concreteReferenceToBar; Foo concreteFooFromConcreteBar = concreteReferenceToBar; Foo fooFromConcreteBar = concreteReferenceToBar; Foo fooFromInterfaceBar = intefaceReferenceToBar; // doesn't work 

Est-ce que quelqu’un connaît une solution de contournement ou est-ce que quelqu’un peut expliquer de manière satisfaisante pourquoi je ne peux pas convertir implicitement interfaceReferenceToBar à Foo , car 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 autorise la diffusion implicite de types d’interface à l’aide de la covariance.

La raison pour laquelle vous ne pouvez pas faire cela est que cela est spécifiquement interdit dans la spécification du langage C #:

Une classe ou une structure est autorisée à déclarer une conversion d’un type source S vers un type cible T, à condition que toutes les conditions suivantes soient remplies:

  • Ni S ni T n’est un object ou un type d’interface .

et

Les conversions définies par l’utilisateur ne sont pas autorisées à convertir depuis ou vers les types d’ interface . En particulier, cette ressortingction garantit qu’aucune transformation effectuée par l’utilisateur ne se produit lors de la conversion vers un type d’interface et qu’une conversion vers un type d’interface ne réussit que si l’object en cours de conversion implémente réellement le type d’interface spécifié.

La source