C# メソッドのオーバーロード解決と null 値の処理
オブジェクト指向プログラミングでは、メソッドのオーバーロードにより、名前は同じでパラメーターが異なる複数のメソッドを使用できます。メソッド呼び出しが行われるとき、オーバーロード解決によってどのメソッドを呼び出すかが決定されます。このシステムは、NULL 値を扱う場合に特に重要になります。
次のクラスについて考えてみましょう:
<code class="language-csharp">public class EffectOptions { 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) { } }</code>
null 値を使用して EffectOptions
の新しいインスタンスを作成する場合、例:
<code class="language-csharp">EffectOptions options = new EffectOptions(null);</code>
オーバーロード解決プロセスでは、最初にアクセス可能なすべてのコンストラクターを識別します。
<code class="language-csharp">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)</code>
次に、パラメーターの型に基づいて適用できないコンストラクターを破棄します。 Point
が値型であると仮定すると、「int」バージョンと「Point」バージョンは削除されます。残り:
<code class="language-csharp">public EffectOptions(params object[] options) public EffectOptions(IEnumerable<object> options) public EffectOptions(string name) public EffectOptions(object owner)</code>
オーバーロード解決システムは、「params」コンストラクターを考慮します。展開しても展開しなくてもよいため、展開された形式は破棄されます。これにより、次の候補コンストラクターが生成されます:
<code class="language-csharp">public EffectOptions(object[] options) public EffectOptions(IEnumerable<object> options) public EffectOptions(string name) public EffectOptions(object owner)</code>
最後に、最適な候補者を特定します。これには、形式パラメータの特異性の比較が含まれます。 「object」は他のすべてのタイプよりも具体性が低いため、「object」バージョンは削除されます。 IEnumerable<object>
も object[]
より具体性が低いため、除外されます。 2 つの候補が残ります:
<code class="language-csharp">public EffectOptions(object[] options) public EffectOptions(string name)</code>
ただし、object[]
は string
よりも具体的でもなく、具体的でもないため、曖昧性エラーが発生します。オーバーロード解決システムは、どのコンストラクターを呼び出すかを最終的に決定できません。
以上が複数のコンストラクターが存在する場合、C# メソッドのオーバーロード解決は Null 値をどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。