Contexte:
Supposons que j'ai la classe suivante:Pourquoi cette conversion de type implicite en C# échoue-t-elle?
class Wrapped<T> : IDisposable
{
public Wrapped(T obj) { /* ... */ }
public static implicit operator Wrapped<T>(T obj)
{
return new Wrapped<T>(obj);
}
public void Dispose() { /* ... */ }
}
Comme vous pouvez le voir, il fournit un opérateur de conversion de type implicite pour T
→ Wrapped<T>
. En fin de compte, je voudrais être en mesure d'utiliser cette classe comme suit:
interface IX { /* ... */ }
class X : IX { /* ... */ }
...
IX plainIX = new X();
using (Wrapped<IX> wrappedIX = plainIX)
{
/* ... */
}
Problème:
Cependant, la conversion de type dans la clause using
ci-dessus échoue. Bien que je puisse attribuer un new X()
directement à wrappedIX
, je ne suis pas autorisé à lui assigner quoi que ce soit de type IX
. Le compilateur se plaindra avec l'erreur suivante:
Compiler error CS0266: Cannot implicitly convert type 'IX' to 'Wrapped<IX>'. An explicit onversion exists (are you missing a cast?)
Je ne comprends pas cela. Quel est le problème ici?
compilable si remplacer "IX plainIX = new X();" avec "X plainIX = new X();" – Nagg
@Nagg: En raison de ce que j'essaie de réaliser (à savoir, de concevoir une interface fluide au-dessus d'une * bibliothèque COM * existante), il est absolument essentiel de programmer contre les interfaces. Par conséquent, votre suggestion n'est pas une option viable, malheureusement. – stakx