2016-03-31 59 views
4

C# dilini daha iyi anlamak için bunun neden bir derleme hatası olduğunu bilmek istiyorum.C# neden "base" arayüzünü ref?

Kodumda IDisposable'tan türeyen bir arabirim (IMyInterface) var. 'ID'ye uygun' tipinde bir param olan başka bir metodum var. Ancak, bu yönteme IMyInterface türünde bir üye var geçemiyorum. İşte aşağıda benim kod örneği:

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) { } 
    } 
} 

derleme hataları şunlardır:

  • Tartışma 1: 'ref System.IDisposable' iyi aşırı yöntem için 'ref CompileErrorBaseInterface.IMyInterface' dan dönüştüremezsiniz maç
  • 'CompileErrorBaseInterface.Program.MyMethodBaseInterface (ref System.IDisposable)' için bazı geçersiz argümanlar vardır

Herkesin buna neden izin verilmediğini açıklayabilir mi, yoksa derleyicinin yapması mümkün değil mi? Ben jenerik kullanarak bir geçici çözüm var, bu yüzden sadece bu şekilde neden yapılmasına izin olmadığını anlamak istiyorum.

Teşekkürler.

cevap

7

Aşağıdaki örneği inceleyelim:

bir IMyInterface MyMethod geçmek için izin verildi ise
private void MyMethod(ref IDisposable foo) 
{ 
    // This is a valid statement, since SqlConnection implements IDisposable 
    foo = new SqlConnection(); 
} 

, sen bir sorun olurdu sadece (IMyInterface uygulamıyor) tip SqlConnection bir nesne tahsis beri IMyInterface türünde bir değişkene.

:

Daha fazla ayrıntı için

, C# gurusu Eric Lippert aşağıdaki blog girdisinde de bakabilirsiniz