12

次のように、C# で誤ってコンストラクターをオーバーロードしてしまいました。

public MyClass(string myString) 
{
    // Some code goes here 
}

public MyClass(string myString, bool myParameter = false) 
{
   // Some different code here
}

このコードを使用すると、私のプロジェクトは正常にコンパイルされました。コンストラクターを引数だけで呼び出した場合string、C# はどのコンストラクターを使用するかをどのように決定するのでしょうか? この機能が構文的に許可されているのはなぜですか?

4

5 に答える 5

13

MSDNから: (強調を追加)

2 つの候補が同等に優れていると判断された場合、呼び出しで引数が省略されたオプションのパラメーターを持たない候補が優先されます。これは、より少ないパラメーターを持つ候補に対するオーバーロードの解決における一般的な好みの結果です。

于 2012-07-20T18:40:23.453 に答える
11

この機能が構文的に許可されているのはなぜですか?

生成された IL に関しては、2 番目のコンストラクターは依然として 2 つの引数です。唯一の違いは、2 番目の引数にデフォルト値を提供する属性があることです。

コンパイラに関する限り、単一の文字列でコンストラクターを呼び出す場合、技術的には最初の方が適しています。これを単一の引数で呼び出すと、最初のコンストラクターが最もよく一致し、2 番目のコンストラクターは呼び出されません。

C# 仕様はこれを明確に示しています。7.5 では、「... インスタンス コンストラクターはオーバーロード解決を使用して、関数メンバーの候補セットのどれを呼び出すかを決定する」と述べています。次に、特定のルールが 7.5.3.2 で指定され、この特定のルールが適用されます。

それ以外の場合、MP のすべてのパラメーターに対応する引数があり、MQ の少なくとも 1 つのオプションのパラメーターをデフォルトの引数で置き換える必要がある場合、MP は MQ よりも優れています。

この場合、MP (最初のコンストラクター) にはすべての引数がありますが、MQ (2 番目のコンストラクター) には「少なくとも 1 つのオプションのパラメーター」が必要です。

于 2012-07-20T18:37:14.047 に答える
2

名前付き引数と省略可能な引数を使用すると、次のようにオーバーロードの解決に影響します。

メソッド、インデクサー、またはコンストラクターは、その各パラメーターが省略可能であるか、名前または位置によって呼び出しステートメントの 1 つの引数に対応しており、その引数をパラメーターの型に変換できる場合に実行の候補になります。 .

複数の候補が見つかった場合は、明示的に指定された引数に優先変換のオーバーロード解決ルールが適用されます。オプション パラメーターの省略された引数は無視されます。

2 つの候補が同等に優れていると判断された場合、呼び出しで引数が省略されたオプションのパラメーターを持たない候補が優先されます。これは、より少ないパラメーターを持つ候補のオーバーロード解決における一般的な好みの結果です。

MSDNから引用。

于 2012-07-20T18:38:00.100 に答える
1

オプションのパラメーターを持つメソッドは、オーバーロードによって非表示になります。

あなたに警告するReSharperルールさえあります。

ここに画像の説明を入力

ここでは、なぜそれが許可されているかについての有益な議論を見つけることができます。まったく問題ないと考える人もいます。

http://youtrack.jetbrains.com/issue/RSRP-287157

于 2012-07-20T18:48:46.147 に答える
0

最初のものをより適切なものとして選択するに違いありません。

名前付き引数と省略可能な引数を使用すると、次のようにオーバーロードの解決に影響します。

  • メソッド、インデクサー、またはコンストラクターは、その各パラメーターが省略可能であるか、名前または位置によって呼び出しステートメントの 1 つの引数に対応しており、その引数をパラメーターの型に変換できる場合に実行の候補になります。 .

  • 複数の候補が見つかった場合、
    明示的に指定された引数に優先変換のオーバーロード解決ルールが適用されます。オプション パラメーターの省略された引数は
    無視されます。


  • 2 つの候補が同等に優れていると判断された場合、呼び出しで引数が省略されたオプションのパラメーターを持たない候補が優先されます。これは、 より少ないパラメーター
    を持つ候補のオーバーロード解決における一般的な好みの結果です。

于 2012-07-20T18:35:15.497 に答える