首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 方法多載解析規則深度解析:精確匹配、繼承關係與裝箱轉換

     編輯:關於C#

多載定義條件

同一類別中,方法名稱相同,參數列表不同(個數、型別、順序),與回傳型別無關。

編譯期解析規則(靜態綁定)

  1. 精確匹配優先:引數型別與參數型別完全相同。
  2. 隱含轉換:衍生類→基類、介面實作、數值擴大轉換(int→long)、裝箱(值型別→object)。
  3. 最佳匹配:若多個候選皆適用,選擇「最精確」者(轉換步驟最少、最接近引數實際型別)。
  4. 模稜兩可報錯:無法決定最佳者(如兩個不相關類別皆隱含轉換),編譯失敗 CS0121。

實測案例分析

案例 1:String vs Object


static void Show(string s) => Console.WriteLine("String");
static void Show(object o) => Console.WriteLine("Object");

static void Main()
{
    Show(null);      // String(null 推斷為 string,最精確)
    Show("");        // String
    object o = "hi"; Show(o); // Object(靜態型別為 object)
    Show(1);         // Object(int→object 裝箱,無 int 多載)
}

IL 驗證:Show(null) 產生 call void Show(string);Show(1) 含 box int32 指令。

案例 2:模稜兩可


static void Show(string s) => Console.WriteLine("String");
static void Show(Program p) => Console.WriteLine("Program"); // Program 與 string 無繼承關係

static void Main() { Show(null); } // CS0121:無法決定 string 或 Program 較精確

案例 3:數值型別階層


static void Show(object o) => Console.WriteLine("Object");
static void Show(ValueType v) => Console.WriteLine("ValueType"); // 若存在
// Show(1) 會優先匹配 ValueType(int 繼承 ValueType),再 fallback Object

實務建議

  • 避免在同一類別對「基類」與「衍生類」同時提供多載,易造成混淆。
  • 提供 object 多載時,考慮同時提供常用值型別(int、double、bool)多載以避免裝箱。
  • 使用 params 陣列多載時,置於最後;編譯器優先匹配固定參數版本。
  • 命名指引:語意相同才多載;語意不同請用不同名稱(如 LoadFile/LoadStream)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved