2016-08-30 6 views
18

2つのオーバーロードメソッドを持つ次のクラスがあります。オプションのパラメータを使用したメソッドのオーバーロード

Class A 
{ 
    public string x(string a, string b) 
    { 
     return "hello" + a + b; 
    } 

    public string x(string a, string b, string c = "bye") 
    { 
     return c + a + b; 
    } 
} 

私は2つのパラメータを持つ別のクラスからメソッドxを呼び出した場合、その方法は、実行しようとする理由は?すなわち、

string result = new A().x("Fname", "Lname"); 

私はこれを私のコンソールアプリケーションでテストし、2つのパラメータを持つメソッドを実行しました。誰かがこれを説明できますか?

+0

基本的には:その場合、あなたは決してそれを使用しないので、デフォルト値を持つことは全く役に立たない... – Bakuriu

+6

私はこのコードがコンパイル時エラーを出さないことに驚いています。 –

答えて

21

という名前およびオプションの引数を使用すると、オーバーロードの解決に影響を与えます。2つの候補が等しく良好と判断された場合、優先順位は、引数 はでは省略されたためにオプションのパラメータを持っていません 候補になり

コール。これは、より少ない数の パラメータを有する候補について、オーバーロード解決における一般的な プリファレンスの結果である。

リファレンス:呼び出されるstring x(string a,string b) 2つのパラメータで上記の規則方法を意味MSDN


注:両方のオーバーロードされたメソッドは、オプションのパラメータを持っている場合、コンパイラは、コンパイル時の曖昧エラーを与えるだろう。

+5

コンパイル時に***コンパイル時に***あいまいエラー:) –

+1

が表示され、修正されます。ありがとう。 – JerryGoyal

4

2つのパラメータでメソッドを呼び出すと、2つのパラメータを持つメソッドが使用されます。もしあなたが3つのものを呼び出すなら、それはもう一方を使うでしょう。

0

それは常に正確なパラメータなしのと最初の試合は、あなたのケースでは、それが実行される方法で実行されます:

オプションパラメータ法の優先順位は、正確なパラメータなしの持つ機能、その後小さいを

public string x(string a, string b); 
関連する問題