共用方式為


解決影響多載解析的錯誤和警告。

本文涵蓋下列編譯器錯誤:

  • CS0034 - 運算子用在類型 'type1' 和 'type2' 時的運算元上時,其意義會模稜兩可
  • CS0035 - 運算子用在類型 'type' 的運算元上時其意義會模稜兩可
  • CS0111 - 類型已定義具有相同參數類型名為 'name' 的成員
  • CS0121 - 呼叫在以下方法或屬性之間時,其意義會模稜兩可
  • CS0457 - 從 'type1' 轉換到 'type2' 時,使用者定義的轉換不明確
  • CS0663 - 不可定義只有 refout 不同的多載方法。
  • CS1007 - 屬性存取子已定義
  • CS1019 - 必須是可多載的一元運算子
  • CS1020 - 必須是可多載的二元運算子
  • CS1501 - 方法 'method' 沒有多載採用 'number' 引數
  • CS1534 - 多載的二元運算子 'operator' 接受兩個參數
  • CS1535 - 多載一元運算子 'operator' 接受一個參數
  • CS1928 - 'Type' 不包含 'method' 的定義,而且最佳的擴充方法多載 'method' 有一些無效的引數。
  • CS1929 - 'TypeA' 不包含 'method' 的定義,且最佳擴展方法多載 'TypeB.method' 需要類型 'TypeC' 的接收器
  • CS8315 - 運算子用在運算元上時,其意義會模稜兩可
  • CS9261 - 無法對覆寫成員使用 'OverloadResolutionPriorityAttribute'。
  • CS9262 - 無法對此覆寫成員使用 'OverloadResolutionPriorityAttribute'。

另外,編譯器警告如下:

  • CS3006 - 只有 refout 或陣列陣序差異的多載方法 'method',不符合 CLS 標準

不正確的多載定義

  • CS0663 - 不可定義只有 refout 不同的多載方法。
  • CS1019 - 必須是可多載的一元運算子
  • CS1020 - 必須是可多載的二元運算子
  • CS1534 - 多載的二元運算子 'operator' 接受兩個參數
  • CS1535 - 多載一元運算子 'operator' 接受一個參數

另外,編譯器警告如下:

  • CS3006 - 只有 refout 或陣列陣序差異的多載方法 'method',不符合 CLS 標準

當您在類別中建立多載運算子時,簽章必須與該運算子所需的參數數量相符。 運算子定義中的參數數量錯誤。

此外,多載運算子必須使用定義的運算子名稱。 唯一的例外狀況是當您建立轉換運算子時,該運算子名稱符合轉換的傳回類型。

重複多載已定義

  • CS0111 - 類型已定義具有相同參數類型名為 'name' 的成員
  • CS1007 - 屬性存取子已定義

這些錯誤表示您建立了沒有區別的多載版本。 常見原因包括:

  • 比對參數類型具有身分識別轉換。 例如 M(dynamic)M(object),或 M2(string)M2(string?)
  • 比對參數類型只有在參考修飾詞中有所不同。 例如,M(ref int)M(out int)
  • 您已為屬性新增了 initset 存取子。

找不到多載

  • CS1501 - 方法 'method' 沒有多載採用 'number' 引數
  • CS1928 - 'Type' 不包含 'method' 的定義,而且最佳的擴充方法多載 'method' 有一些無效的引數。
  • CS1929 - 'TypeA' 不包含 'method' 的定義,且最佳擴展方法多載 'TypeB.method' 需要類型 'TypeC' 的接收器

您的程式碼呼叫了一個方法,該方法的名稱存在,但某些參數不正確,或是您使用的參數數量錯誤。 如果您嘗試呼叫擴充方法,則包含該方法的類別可能位於未匯入的命名空間中。

注意

在最新的編譯器中不會使用錯誤 CS1928。 較新的編譯器只會使用 CS1929

模糊的多載

  • CS0034 - 運算子用在類型 'type1' 和 'type2' 時的運算元上時,其意義會模稜兩可
  • CS0035 - 運算子用在類型 'type' 的運算元上時其意義會模稜兩可
  • CS0121 - 呼叫在以下方法或屬性之間時,其意義會模稜兩可
  • CS0457 - 從 'type1' 轉換到 'type2' 時,使用者定義的轉換不明確
  • CS8315 - 運算子用在運算元上時,其意義會模稜兩可

這些錯誤表示沒有哪個多載版本比其他版本更好。 造成這些錯誤的可能原因如下:

  • 對於每個參數來說,不同的參數更好。 其中一個可能完全相符,另一個需要轉換:

      void M(int a, double b) {    }
      void M(double a, int b) {}
    
      M(1, 1); // ambiguous
    
  • 多個使用者定義的轉換運算子是候選者。 轉換運算子可以在來源類型、其基底類型、目標類型或其基底類型中宣告。 如果在多個地方定義了轉換運算子,則編譯器會無法選擇。

  • 多個轉換運算子可以執行相容的轉換。

  • 一個或多個參數使用了 default (不是 default(T)),因此可以選擇多個類型。

在大多數這種情況下,新增顯式轉換可以指定應該選擇哪個多載。

多載解析優先順序

  • CS9261 - 無法對覆寫成員使用 'OverloadResolutionPriorityAttribute'。
  • CS9262 - 無法對此覆寫成員使用 'OverloadResolutionPriorityAttribute'。

您的程式碼違反了規則,使用 OverloadResolutionPriorityAttribute 支援一個多載,而不是於另一個多載。 您不能將 OverloadResolutionPriorityAttribute 套用到以下方法類型:

  • 非索引器屬性
  • 屬性、索引器或事件存取子
  • 轉換運算子
  • Lambda
  • 區域函式
  • 完成項
  • 靜態建構函式

此外,您不能將 OverloadResolutionPriorityAttribute 套用至 virtualabstract 成員的 override。 編譯器使用基底類型宣告中的值。