Impossible de convertir implicitement le Système.IDisposable lors de l'utilisation de “l'Aide”
Donné deux interfaces comme celles-ci:
public interface MyInterface1 : IDisposable
{
void DoSomething();
}
public interface MyInterface2 : IDisposable
{
void DoSomethingElse();
}
... et une mise en œuvre de la classe comme ceci:
public class MyClass : IMyInterface1, IMyInterface2
{
public void DoSomething() { Console.WriteLine("I'm doing something..."); }
public void DoSomethingElse() { Console.WriteLine("I'm doing something else..."); }
public void Dispose() { Console.WriteLine("Bye bye!"); }
}
... Je suppose que l'extrait de code suivant devrait compiler:
class Program
{
public static void Main(string[] args)
{
using (MyInterface1 myInterface = new MyClass()) {
myInterface.DoSomething();
}
}
}
... au lieu de cela, je reçois toujours le message d'erreur suivant:
Error 1 'IMyInterface1': type used in a using statement must be implicitly convertible to 'System.IDisposable'
Une idée? Merci.
- Êtes-vous sûr que vous avez entré tout correctement? Vous avez
MyInterface1
etMyInterface2
en haut, maisIMyInterface1
etIMyInterface2
plus tard. - s'il vous plaît poster précis de code seulement. Vérifier avant de poster.
- Comme écrit ci-dessus, nous avons d'autres erreurs de compilation, pas celui que vous décrivez. Cependant, la façon dont vous avez écrit les types ci-dessus, chacun des types d'interface (en soi) est implicitement convertible
IDisposable
. - Est vous le problème réel, que le type de classe peuvent être convertis à
IDisposable
de deux façons distinctes, grâce à différentes interfaces mises en œuvre? - Non, MyClass n'implémente qu'une seule fois. Les 2 branches sont pliées, ce que le C++ appelle l'héritage virtuel.
- Oui, j'avais tort. La seule fois qu'il question de "re-mettre en œuvre" une interface, c'est quand vous avez une base de class, qui fournit déjà un (explicite) de la mise en œuvre de l'interface. Cette situation est totalement sans rapport avec le libellé de la question tel qu'il est.
Vous devez vous connecter pour publier un commentaire.
Fonctionne correctement
vous avez juste oublié de faire
Dispose()
public, et le nom de l'interface a été mauvais (MyInterfaceX
au lieu deIMyInterfaceX
)Ideone: http://ideone.com/WvOnvY
var
dans leusing
déclaration?!Vous doit (aussi) ont vu une erreur de compilateur sur
Dispose()
de ne pas être en public.La
Dispose()
méthode dans cette classe ne peut pas être mise en œuvreIDisposable
, donc il doit y avoir quelque chose de plus passe.