2013-06-30 2 views
6

今日、私は何か変わったことを発見しました。この作品、なぜ私が疑問に思う:paramsとoptionalsを使ったC#メソッドのオーバーロード

static void Main(string[] args) 
{ 
    Console.WriteLine(ExampleMethod(3)); 
    Console.ReadKey(); 
} 

public static string ExampleMethod(int required, params int[] optionalint) 
{ 
    return "ExampleMethod 2"; 
} 

public static string ExampleMethod(int required, string optionalstr = "default string", int optionalint = 10) 
{ 
    return "ExampleMethod 1"; 
} 

はそれについて考える:あなたは(3)ExampleMethodを呼び出し、結果はどのようなものです。

私の意見では、予測不可能な結果につながります。私の場合、常に方法1が呼び出されました。しかし、メソッド1のシグネチャを変更すると、メインメソッドはメソッド2を呼びました(もちろん)。

私はこのような動作が期待できませんでした。私は "AmbiguousReferenceException"または少なくともコンパイラの警告を期待していました。

+0

短い答え:スペックがそう言っているからです。 http://www.microsoft.com/en-us/download/details.aspx?id=7029 –

答えて

5

コンパイラがデフォルト値optionalstroptionalintを知っているため、使用する値に基づいて決定できるため、この動作が予想されます。 int[] optionalintの値として何を設定するのかはわかりません。コンパイラは、オプションのパラメータを持つときに使用するものを「より確実に」判断するので、そのメソッドを呼び出します。

あなたはこの

public static string ExampleMethod(int required) 
{ 
    return "ExampleMethod 3"; 
} 

のような余分なメソッドを追加した場合、これは、コンパイラは最初のオプションパラメータを持っていない方法のために行くので、呼ばれるメソッドになります。

More detailed explanationオーバーロードの解像度。

+0

オーバーロードの解決がかなり詳細なルール。同様の質問に対するこの回答には、さらに詳しい情報があります:http://stackoverflow.com/questions/3190248/how-does-c-sharp-choose-with-ambiguity-and-params –

+0

ありがとう、私は答え。 – keyboardP

+0

aaah、そうだよ。ありがとうございました。これまでのところ、1つのバージョンではパラメータが暗黙的に設定されていたとは思っていませんでした。 – baschdy

関連する問題