正確なルールについては、オーバーロード解決の仕様を参照してください。ざっくりですが、こんな感じです。
まず、アクセス可能なすべてのコンストラクターのリストを作成します。
public EffectOptions ( params object [ ] options )
public EffectOptions ( IEnumerable<object> options )
public EffectOptions ( string name )
public EffectOptions ( object owner )
public EffectOptions ( int count )
public EffectOptions ( Point point )
次に、適用できないコンストラクターをすべて削除します。適用可能なコンストラクターとは、すべての仮パラメーターに対応する引数があり、その引数が暗黙的に仮パラメーターの型に変換できるコンストラクターです。Point が値型であると仮定して、"int" および "Point" バージョンを除外します。それは去る
public EffectOptions ( params object[] options )
public EffectOptions ( IEnumerable<object> options )
public EffectOptions ( string name )
public EffectOptions ( object owner )
ここで、「params」を含むものが展開された形式または展開されていない形式で適用できるかどうかを検討する必要があります。この場合、両方の形式に適用できます。その場合は、展開されたフォームを破棄します。だからそれは去る
public EffectOptions ( object[] options )
public EffectOptions ( IEnumerable<object> options )
public EffectOptions ( string name )
public EffectOptions ( object owner )
次に、適用可能な候補の中から最適なものを決定する必要があります。最良のルールは複雑ですが、短いバージョンでは、より具体的であるほど具体的でないよりも優れています。キリンは哺乳類よりも具体的であり、哺乳類は動物よりも具体的であり、動物は物体よりも具体的です。
バージョンはそれらobject
すべてよりも具体的ではないため、削除できます。バージョンはIEnumerable<object>
バージョンより具体的ではないobject[]
ため (理由がわかりますか?)、削除することもできます。それは去る
public EffectOptions ( object[] options )
public EffectOptions ( string name )
そして今、私たちは立ち往生しています。object[]
は よりも具体的ではありませんstring
。したがって、これによりあいまいなエラーが発生します。
これは簡単なスケッチです。実際のタイブレーク アルゴリズムははるかに複雑です。しかし、それらは基本です。