2016-03-31 7 views
4

Ich möchte wissen, warum dies ein Kompilierungsfehler ist, um die C# Sprache besser zu verstehen.C# Warum kann ich nicht "Basis" -Schnittstelle durch Ref übergeben?

In meinem Code habe ich eine Schnittstelle (IMyInterface), die von IDisposable abgeleitet ist. Ich habe eine andere Methode, die einen Parameter vom Typ 'ref IDisposable' verwendet. Aber ich kann eine Member-Variable vom Typ IMyInterface nicht an diese Methode übergeben. Hier ist mein Beispielcode unten:

using System; 

namespace CompileErrorBaseInterface 
{ 
    public interface IMyInterface : IDisposable { } 

    class Program 
    { 
     private IMyInterface _myInterfaceObj; 

     static void Main(string[] args) { } 

     public void ExampleMethod() 
     { 
      MyMethodBaseInterface(ref _myInterfaceObj); //compile error 
      MyMethodDerivedInterface(ref _myInterfaceObj); //no compile error 
     } 

     private void MyMethodBaseInterface(ref IDisposable foo) { } 

     private void MyMethodDerivedInterface(ref IMyInterface foo) { } 
    } 
} 

Die Kompilierung Fehler sind:

  • Argument 1: Konvertierung von 'ref CompileErrorBaseInterface.IMyInterface' auf 'ref System.IDisposable' Die besten überladene Methode Spiel für
  • 'CompileErrorBaseInterface.Program.MyMethodBaseInterface (ref System.IDisposable)' hat einige ungültige Argumente

Kann irgendjemand erklären, warum dies für den Compiler nicht erlaubt oder nicht möglich ist? Ich habe eine Problemumgehung mit Generics, also möchte ich nur verstehen, warum es so nicht erlaubt ist.

Danke.

Antwort

7

Betrachten Sie das folgende Beispiel:

private void MyMethod(ref IDisposable foo) 
{ 
    // This is a valid statement, since SqlConnection implements IDisposable 
    foo = new SqlConnection(); 
} 

Wenn Sie ein IMyInterface-MyMethod durchgelassen wurden, würden Sie ein Problem haben, da Sie nur ein Objekt vom Typ zugeordnet SqlConnection (die nicht IMyInterface nicht implementiert) zu einer Variablen vom Typ IMyInterface.

Für weitere Informationen haben einen Blick auf den folgenden Blog-Eintrag von C# Guru Eric Lippert: