Nicht in der Lage zu konvertieren implizit in System.IDisposable, wenn Sie mit "Mit"
Gegeben, zwei-Schnittstellen wie diese:
public interface MyInterface1 : IDisposable
{
void DoSomething();
}
public interface MyInterface2 : IDisposable
{
void DoSomethingElse();
}
... und eine Klasse Umsetzung, wie diese:
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!"); }
}
... Ich würde davon ausgehen, das folgende code-snippet sollte kompilieren:
class Program
{
public static void Main(string[] args)
{
using (MyInterface1 myInterface = new MyClass()) {
myInterface.DoSomething();
}
}
}
... stattdessen bekomme ich immer die folgende Fehlermeldung:
Error 1 'IMyInterface1': type used in a using statement must be implicitly convertible to 'System.IDisposable'
Irgendeine Idee? Danke.
- Sind Sie sicher, Sie haben alles richtig eingegeben? Sie haben
MyInterface1
undMyInterface2
an der Spitze, aberIMyInterface1
undIMyInterface2
später auf. - poste bitte genaue code nur. Überprüfen Sie vor der Veröffentlichung.
- Wie oben geschrieben, bekommen wir andere Zusammenstellung von Fehlern, nicht die, die Sie beschreiben. Jedoch, die Art, wie Sie schrieb den Typen vor, die jeweils das interface-Typen (in sich selbst) ist implizit konvertierbar
IDisposable
. - Ist Sie wirkliche problem ist, dass die Klasse-Typ konvertiert werden kann
IDisposable
auf zwei verschiedene Arten, durch verschiedene Schnittstellen implementiert? - Nein, MyClass implementiert nur einmal. Die 2 äste sind gefaltet, was C++ ruft der virtuellen Vererbung.
- Ja, ich war falsch. Das einzige mal, es könnte eine Rolle spielen, zu "re-Implementierung" eine Schnittstelle ist, wenn Sie einen base - Klasse, die bereits versorgt eine (explizite) Implementierung der Schnittstelle. Diese situation ist völlig unabhängig von der tatsächlichen Frage, wie es steht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Richtig funktioniert
du einfach nur vergessen zu machen
Dispose()
öffentlichkeit, und die Namen der interfaces falsch war (MyInterfaceX
stattIMyInterfaceX
)Ideone: http://ideone.com/WvOnvY
var
imusing
Erklärung?!Sollten Sie (auch) gesehen haben, ein compiler-Fehler über
Dispose()
nicht öffentlich.Den
Dispose()
Methode in dieser Klasse nicht implementiertIDisposable
, so muss es etwas mehr Los ist.