私には次の2人の俳優がいるとします。
public SomeClass(string a, Color? c = null, Font d = null)
{
// ...
}
public SomeClass(string a, Font c = null, Color? d = null)
{
// ...
}
〜そして私はこれをします:
SomeClass sc = new SomeClass("Lorem ipsum");
私はこれを取得します:「エラー1呼び出しは次のメソッドまたはプロパティの間であいまいです[...]」
私が最終結果としてどちらを参照するかは同じでも問題ないことは明らかです(少なくともこの特定のケースでは、そして今のところそれだけが私にとって重要です)。この?
編集1:@oltman:簡略化された例。
書けるようになりたい
[...] new SomeClass("Lorem", Color.Green)
の代わりに
[...] new SomeClass("Lorem", null, Color.Green)
どちらのコンストラクタも同じ数の引数を取りますが、順序は異なります。 2つのコンストラクターパラメーターのデフォルト値を指定しているため、2番目の引数が指定されていない場合、コンパイラーは2つのオーバーロードを区別できません。
既存のコンストラクタを削除して、次のものに置き換えることをお勧めします。
public SomeClass(string a, Color? color, Font font)
{
// constructor implementation
}
public SomeClass(string a) : this(a, null, null) {}
public SomeClass(string a, Color color) : this(a, color, null) {}
public SomeClass(string a, Font font) : this(a, null, font) {}
強制的に動作させる1つの方法:
SomeClass sc = new SomeClass("Lorem ipsum", (Color?)null, (Font)null);
これはanti-pattern
の完璧な例であり、これを回避する最良の方法は@Phil Kleinの回答です。
次に、クラスをnullとして渡すための別の構文を示します。
SomeClass sc = new SomeClass("Lorem ipsum", null as Color, null as Font);
文字列のみを取る別のコンストラクタを作成し、上記のコンストラクタを更新して、2番目のパラメータを必須にすることはできますか?
常に文字列を提供し、次にオプションで色またはフォント、あるいはその両方を提供することでオブジェクトを構築できるという考えの場合は、次のようにします。
public SomeClass(string a)
{
// ...
}
public SomeClass(string a, Color? c)
{
// ...
}
public SomeClass(string a, Font f, Color? d = null)
{
// ...
}
私はこれを取得します:「エラー1呼び出しは次のメソッドまたはプロパティの間であいまいです[...]」
最終結果が同じであるとして私がどちらを参照するかは重要ではないことは私には明らかなようです
呼び出しisがあいまいです。各コンストラクターは一意です。インスタンスを作成して返す場合でも、コンストラクターごとに異なるロジックが存在する可能性があるため、問題ではありません。コンパイラはまだあなたがどのコンストラクタを意味するのか知りません。