2016-03-31 4 views
4

C#言語をよりよく理解するために、これがコンパイルエラーである理由を知りたいと思います。C#なぜ「ベース」インターフェースをrefで渡すことができないのですか?

私のコードでは、私はIDisposableから派生するインターフェイス(IMyInterface)を持っています。私は 'ref IDisposable'型のパラメータを取る別のメソッドを持っています。しかし、IMyInterface型のメンバーvarをそのメソッドに渡すことはできません。ここに私のコード例は以下の通りです:

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

コンパイルエラーは、次のとおりです。

  • 引数1: 'REF System.IDisposable' 最善のオーバーロードされたメソッドに 'REF CompileErrorBaseInterface.IMyInterface' から変換することはできません試合
  • 'CompileErrorBaseInterface.Program.MyMethodBaseInterface(REF System.IDisposable)' のため、いくつかの無効な引数を持ってい

これはなぜ許可されていないのか、またはコンパイラが行うことができないのか誰にも説明できますか?ジェネリックスを使用した回避策があるので、なぜこのようにすることが許されないのか理解したいだけです。

ありがとうございました。

答えて

7

は、次の例を考えてみましょう:

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

あなたがMyMethodIMyInterfaceを渡すことが許された場合、あなたは(IMyInterfaceを実装していません)あなただけのタイプSqlConnectionのオブジェクトが割り当てられているので、問題を抱えていると思いますタイプIMyInterfaceの変数に変換します。詳細については

、C#の第一人者エリックリペットの以下のブログのエントリを見て:

関連する問題