2011-07-14 5 views
5

私は、オプションのパラメータで遊んでいて、次のシナリオの間に来ました。インターフェイスメソッドにパラメータがない場合、すべてのオプションパラメータを含むメソッドが実装で認識されないのはなぜですか?

私は私のクラスにメソッドを持っている場合は、すべてのパラメータがオプションであるところ、私は次のコードを書くことができます:私は、その後のようなインターフェイスを作成する場合は

public class Test 
{ 
    public int A(int foo = 7, int bar = 6) 
    { 
     return foo*bar; 
    } 
} 
public class TestRunner 
{ 
    public void B() 
    { 
     Test test = new Test(); 
     Console.WriteLine(test.A()); // this recognises I can call A() with no parameters 
    } 
} 

を:

public interface IAInterface 
    { 
     int A(); 
    } 

もし私がテストクラスがこのインタフェースを実装するようにしてから、IAInterfaceのインタフェースメンバA()が実装されていないとコンパイルしません。インタフェースの実装が、すべてのオプションのパラメータを持つメソッドであると解決されないのはなぜですか?

答えて

4

これらは、2つの異なる方法です。 1つは2つのパラメータ、1つはゼロです。オプションのパラメータは構文的な砂糖だけです。あなたの方法Bを次のようにコンパイルされます:

public void B() 
{ 
    Test test = new Test(); 
    Console.WriteLine(test.A(7, 6)); 
} 

あなたが生成されたILコードを見て、これを確認することができます。

0

IAInterfaceを実装するためのテストが必要になったら、今は契約に準拠していないクラスがあります。インタフェースは明示的に満たされなければなりません。コンパイラは、A()とA(int foo = 7、int bar = 6)が同じではないことを判断しません。彼らは2つの異なる署名を持っています。一つはパラメータを許さず、もう一つは値が与えられなければデフォルトを提供するものです。

1

この件に関するEric Lippertのブログ投稿の4部構成のシリーズを読むことができます。そのようなコーナーケースを示し、それらが実際に異なる方法である理由を理解できるようになります。

http://ericlippert.com/2011/05/09/optional-argument-corner-cases-part-one/

+0

+1リンクありがとうございました! –

+0

よろしくお願いします! EricはC#コンパイラチームのメンバーの一人であり、彼は興味深い情報をたくさん投稿しています(彼のブログだけでなく、実際にここにもあります)。 – Lucero