2016-06-23 12 views
4

:から(問題なくコンパイルパラメータ:(必須、オプション)対(必須、必要、オプション)Iは、以下の方法定義した

void Write(string fileContent, string fileName, string container = StorageBlobContainers.ProfilePictures) 

コードを、私はそれを実行するコードを書い別のファイル):

string json = JsonConvert.SerializeXNode(node); 
FileProcessor.Write(json, "productscontainer"); 

しかし、何らかの理由でそれは何もしなかったようです。
問題を理解するのに苦労して数分後、私はついにそれを見つけました。

void Write(string filePath, string container = StorageBlobContainers.ProfilePictures) 
{ 
    if (!File.Exists(filePath)) 
    return string.Empty; 
    ... 

それがうまくコンパイル行ったようにこれは本当に、私は混乱し、一つの方法は、3パラメータ署名と持っているとして、もちろん、それは理にかなって:どこか同じクラスで、次のように定義されたWrite機能がすでにありました他の人は2人ですが、これはあまりあいまいではなく、エラーが発生しやすいでしょうか?私にとっては、どちらの方法も「論理的」なものではないようです。なぜ、第2のものが他のものよりも選ばれているのですか?

+0

「なぜ2番目のものが他のものよりも優先されますか?」 - それらは言語の規則なので。もしあなたが望むなら、私たちは言語仕様からほこりを取り除いて、その点につながる具体的な理由を指摘することができますが、あなたをさらに進めることはありません。 –

+0

第2の方法はどのように論理的な選択肢ではないのですか? 2つの文字列パラメータを持つメソッドを呼び出すと、2つの文字列パラメータを持つメソッドが選択されます。それは完璧なフィット感です。 –

+0

また、オプションのパラメータがバージョン1以降の言語に追加されていることに留意してください。古いコードに戻ってデフォルトを追加するだけで、以前にコンパイルされたコードがコンパイルに失敗したり、 –

答えて

0

はい、メソッドの解像度は厄介なものになる可能性があるので、複数のオーバーロードを記述するときは常に注意してください。彼らは今のようにあなたにあいまいであってはなりません。コンパイラはちょうど最短のマッチを選んだだけです。それはそれを行うために文書化されているので、まさにその通りです。

あなたが行うことができる2つの事があります。

  • の方法のいずれかの名前を変更しますが。これにより、メソッドの解決がケーキの一部になり、あなたとコンパイラにとっては絶対に明確になります。
  • 両方に必要な最後のパラメータを作成します。これにより、2つまたは3つのパラメータに対して、メソッドの解像度が再び明確になります。
0

これは、指定されます(オーバーロード解決に、C# specificationのセクション7.5.3):

7.5.3.2優れた機能部材良好関数メンバを決定する目的のため

、除去された引数リストAは、元の引数リストに現れる順序で引数式自体を含むように構成されます。 各候補関数メンバのパラメータリストは、次のように構成されます。

•関数メンバが展開されたフォームのみに適用された場合、展開されたフォームが使用されます。彼らは引数リストの対応する引数と同じ位置で発生するようにパラメータが並べ替えられますなし、対応する引数付き

•オプションのパラメータは、パラメータリスト

から削除されます。

(...)

•デフォルト引数はM Qに少なくとも一つのオプションのパラメータに代入する必要があるのに対し、M Pのすべてのパラメータは、対応する引数を持っている場合、それ以外の場合は、その後M PはM Qよりも優れています

(など)

だからあなたの場合には、引数とオプションのパラメータは、オーバーロードの解決に考慮されているので、(オプションのパラメータを持つ)二つ目は、より具体的にあなたにマッチします

0

C#仕様(バージョンによって異なります)セクション1.6.6.5では、メソッドオーバーロードを扱います。また、この質問は、二つの候補が等しく良好と判断された場合

、好みがに行く関連するセクションが含まれている次のMSDNの記事MSDN

にリンクしているあなたがOVerload with optional parametersを求めていると同じですコールで引数が省略されたオプションのパラメータを持たない候補。これは、より少ないパラメータを有する候補について過負荷解決の一般的な好みの結果である。

関連する問題