C# 方法重載解析與空值處理
在物件導向程式設計中,方法重載允許使用相同名稱但參數不同的多個方法。當進行方法呼叫時,重載解析決定呼叫哪個方法。當處理空值時,此系統變得特別重要。
考慮以下類別:
<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>
當使用空值建立 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[]
不那麼具體,因此也被消除。剩下兩個候選人:
<code class="language-csharp">public EffectOptions(object[] options) public EffectOptions(string name)</code>
但是,由於 object[]
與 string
既不更具體也不更不具體,這會導致歧義錯誤。重載解析系統無法最終確定要呼叫哪個構造函數。
以上是當存在多個建構函式時,C# 方法重載解析如何處理空值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!