2012-02-24 20 views
6

これは、私はちょうどセマンティクスを通じて働いて適切なコーディングの練習の質問はありません。 はC#:オプションのパラメータと名前付き引数を使用してコンストラクタをオーバーロードしていますか?

public FooClass(string name = "theFoo") 
{ fooName = name; } 

public FooClass(string name, int num = 7, bool boo = true) : this(name) 
{ fooNum = num; fooBool = boo; } 

それはthusly名前付き引数を使用することが可能です...私は、次のコンストラクタを持って言うことができますか...?私は唯一の残り

の世話をするか、引数なしでコンストラクタFooClass(文字列、int型、ブール値)を呼び出すoptionalsに頼って、1つの名前付き引数を渡している

FooClass foo1 = new FooClass(num:1); 

//?以下のように...という名前およびオプションの引数の

FooClass foo2 = new FooClass(); 
+7

どの程度それを試してみてください?あなたはそこにコードを持っています...それが動作するかどうか教えてください! –

+0

[OK]を、私は例のコードが動作しないことを指定したはずですし、私はそれを動作させる方法を知りたいと思いました。 – user1229895

答えて

5

使用は、次の方法でオーバーロードの解決に影響を与えます。そのパラメータの各場合

  • 方法、インデクサ、またはコンストラクタが実行のための候補でありますオプションであるか、名前または位置で呼び出しステートメント内の単一の引数に対応し、その引数はパラメータの型に変換できます。

  • つ以上の候補が見つかった場合、好適な変換のオーバーロード解決ルールが明示的に指定された引数に適用されます。省略可能な引数の省略された引数は無視されます。 2人の候補者が等しく良好と判断された場合

  • 、好みは引数が呼び出しでは省略されたためにオプションのパラメータを持っていない候補者に行きます。これは、より少ないパラメータを有する候補について過負荷解決の一般的な好みの結果である。

http://msdn.microsoft.com/en-us/library/dd264739.aspx

+0

は、私はそれが署名を比較していることを理解し、しかし、あなたはそれを動作させるために私の例のコードを修正してくださいだろうか? – user1229895

+0

どうしたらうまくいかないのですか?それは間違った過負荷を呼びますか?それは例外をスローしますか?申し訳ありません –

+0

とFooClassに過負荷を呼び出すの第二の場合には...明示的に呼び出されて、より少ない署名で、その結果、すべてのoptionalsが無視される引数を記述せずに、最初のケースのためにもそうすぐに... 入力されました()、 不可能です... 答えが省略された省略可能な引数でnamedを使用することはできませんか? – user1229895

0

オプションのパラメータは、任意の必要なパラメータの後に、パラメータリストの末尾に定義されています。呼び出し元が一連のオプションパラメータのいずれか1つの引数を提供する場合は、それ以前のすべてのオプションパラメータの引数を指定する必要があります。引数リストのカンマ区切りの空白はサポートされていません。ここに示されているよう

また、

名前付き引数は、位置引数に従うことができます。 CalculateBMI(123、height:64); ただし、定位置引数は名前付き引数の後に続けることはできません。次の文は、コンパイラエラーを引き起こします。 // CalculateBMI(ウェイト:123,64);

関連する問題