解決影響多載解析的錯誤和警告。
本文涵蓋下列編譯器錯誤:
- CS0034 - 運算子用在類型 '
type1
' 和 'type2
' 時的運算元上時,其意義會模稜兩可 - CS0035 - 運算子用在類型 'type' 的運算元上時其意義會模稜兩可
- CS0111 - 類型已定義具有相同參數類型名為 'name' 的成員
- CS0121 - 呼叫在以下方法或屬性之間時,其意義會模稜兩可
- CS0457 - 從 'type1' 轉換到 'type2' 時,使用者定義的轉換不明確
- CS0663 - 不可定義只有
ref
和out
不同的多載方法。 - 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 - 只有
ref
或out
或陣列陣序差異的多載方法 'method',不符合 CLS 標準
不正確的多載定義
- CS0663 - 不可定義只有
ref
和out
不同的多載方法。 - CS1019 - 必須是可多載的一元運算子
- CS1020 - 必須是可多載的二元運算子
- CS1534 - 多載的二元運算子 'operator' 接受兩個參數
- CS1535 - 多載一元運算子 'operator' 接受一個參數
另外,編譯器警告如下:
- CS3006 - 只有
ref
或out
或陣列陣序差異的多載方法 'method',不符合 CLS 標準
當您在類別中建立多載運算子時,簽章必須與該運算子所需的參數數量相符。 運算子定義中的參數數量錯誤。
此外,多載運算子必須使用定義的運算子名稱。 唯一的例外狀況是當您建立轉換運算子時,該運算子名稱符合轉換的傳回類型。
重複多載已定義
- CS0111 - 類型已定義具有相同參數類型名為 'name' 的成員
- CS1007 - 屬性存取子已定義
這些錯誤表示您建立了沒有區別的多載版本。 常見原因包括:
- 比對參數類型具有身分識別轉換。 例如
M(dynamic)
和M(object)
,或M2(string)
和M2(string?)
。 - 比對參數類型只有在參考修飾詞中有所不同。 例如,
M(ref int)
與M(out int)
。 - 您已為屬性新增了
init
和set
存取子。
找不到多載
- 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
套用至 virtual
或 abstract
成員的 override
。 編譯器使用基底類型宣告中的值。