本文涵蓋下列編譯器錯誤:
- CS0071: 事件的明確介面實作必須使用事件存取子語法。
- CS0106: 修飾詞對此專案無效。
- CS0277: 成員不會實作介面成員,因為它不是公用的。
- CS0425: 方法類型參數的條件約束必須符合介面方法類型參數的條件約束。請考慮改用明確的介面實作。
- CS0460: 覆寫和明確介面實作方法的條件約束繼承自基底方法,因此無法直接指定它們,但 'class' 或 'struct' 條件約束除外。
- CS0470: 方法無法實作類型的介面存取子。使用明確的介面實作。
- CS0473: 明確的介面實作 'method name' 符合多個介面成員。實際選擇的介面成員取決於實作。請考慮改用非明確的實作。
- CS0531: 介面成員不能有定義。
- CS0535:成員未實作接口成員。
- CS0538: 顯式介面宣告中的成員不是介面。
- CS0539:在 可實作的介面成員中找不到明確介面宣告中的成員。
- CS0540: 包含類型不會實作介面成員。
- CS0541: 明確介面宣告只能在類別、記錄、結構或介面中宣告。
- CS0550: 成員新增了一個在介面成員中不存在的存取子。
- CS0551: 明確介面實作遺漏存取子。
- CS0630: 成員無法實作介面成員,因為它有 __arglist 參數。
- CS0686: 存取子無法實作介面成員。使用明確的介面實作。
- CS0736: 成員未實作實例介面成員。它無法實作介面成員,因為它是靜態的。
- CS0737: 成員未實作介面成員。它無法實作介面成員,因為它不是公用的。
- CS0738: 成員未實作介面成員。它不能,因為它沒有相符的傳回類型。
- CS8705:介面成員沒有最具體的實現。任何成員都不是最具體的。
- CS8854: 成員未實作介面成員。
- CS9333: 參數類型必須符合已實作的成員。
- CS9334: 返回類型必須符合已實作的成員。
介面宣告和語法
下列錯誤與宣告明確介面實作時的正確語法和結構有關:
- CS0071: 事件的明確介面實作必須使用事件存取子語法。
- CS0106: 修飾詞對此專案無效。
- CS0531: 介面成員不能有定義。
- CS0538: 明確介面宣告中的成員不是介面。
- CS0541: 明確介面宣告只能在類別、記錄、結構或介面中宣告。
您可以使用下列技術來更正這些錯誤:
- 在明確實作介面事件 (
add) 時,您必須手動提供remove和 事件存取子。 編譯器不會自動產生這些存取子,以取得明確的介面實作,因此您必須明確定義它們,以指定事件的儲存和管理方式。 - 從明確介面實作中移除
public修飾詞 (CS0106) 。 透過介面類型進行存取時,明確的介面實作會隱含地被視為公開,因此public關鍵字是多餘的,在此情況下不被允許。 - 從明確介面實作中移除
abstract修飾詞 (CS0106) 。 明確介面實作會提供實際的實作,而且無法標示為抽象,因為它們無法在衍生類別中覆寫。 - 從介面成員宣告中移除方法本文,或將實作移至實作介面的類別或結構 (CS0531) 。 在 C# 8.0 之前,介面成員不能包含實作;從 C# 8.0 開始,您可以使用特定語法來提供 預設介面方法 。
- 確認明確介面宣告中指定的類型是實際的介面類型 (CS0538) 。 只有介面類型才能用於明確的介面實作語法;嘗試使用類別或其他非介面類型會違反明確的實作規則。
- 將明確介面宣告移至在其基底清單中宣告介面的類別或結構 (CS0541) 。 明確的介面實作必須出現在類別或結構類型的主體內,而且無法在命名空間層級或其他內容中宣告。
如需詳細資訊,請參閱 介面、 明確介面實作,以及如何 實作介面事件。
回傳類型和簽名
當實作方法的簽章不符合介面成員宣告時,會發生下列錯誤:
- CS0738:成員未實作介面成員,因為它的傳回類型不相符,因此無法實作。
- CS8854: 成員未實作介面成員。
- CS9333: 參數類型必須符合已實作的成員。
- CS9334:傳回型別必須符合已實作的成員。
您可以使用下列技術來更正這些錯誤:
- 變更實作方法的傳回類型,以完全符合介面成員中宣告的傳回類型 (CS0738、 CS9334) 。 實作的簽章必須符合介面宣告,因為方法簽章是合約的一部分,可決定要實作哪個介面成員。
- 請確定實作方法中的參數類型完全符合介面成員中宣告的參數類型 (CS9333) 。 每個參數都必須在介面宣告中指定的相同位置具有相同的類型,因為參數類型是編譯器用來比對介面成員的方法簽章的基本元件。
- 當介面屬性宣告
initsetter 時,將init存取子新增至實作屬性(CS8854)。 關鍵字允許init在物件建構期間進行屬性初始化,同時防止之後進行修改,而實作屬性必須提供相同的僅限初始化行為,才能滿足介面合約。
遺漏或不完整的實作
當類別無法完全實作介面,或實作不符合介面合約的成員時,就會發生下列錯誤:
- CS0535: 成員未實作介面成員。
- CS0550: 成員新增在介面成員中找不到的存取子。
- CS0551:顯式介面實作遺漏存取子。
您可以使用下列技術來更正這些錯誤:
- 為介面中宣告的每個成員提供實作,或將類型宣告為
abstract(CS0535) 。 必須實作每個成員,才能滿足介面需求。 - 從實作屬性中移除任何未在介面屬性中宣告的存取子 (CS0550) 。 實作屬性只能包含介面定義中明確宣告的存取子,確保實作不會新增超出介面合約指定的功能。
- 將所有必要的存取子新增至明確的介面實作,以符合介面宣告 (CS0551) 。 介面中宣告的每一個存取子都必須在實作中具有相符簽章的對應存取子,因為實作必須履行介面所定義的完整存取子合約。
成員匹配和解決
嘗試實作介面中不存在的介面成員,或包含類型未宣告介面時,會發生下列錯誤:
- CS0539:在 可實作的介面成員中找不到明確介面宣告中的成員。
- CS0540: 包含類型不會實作介面成員。
您可以使用下列技術來更正這些錯誤:
- 確認明確介面實作中的成員名稱和簽章完全符合介面中宣告的成員,或移除不正確的實作 (CS0539) 。 您嘗試實作的成員必須實際存在於介面定義中,且名稱、傳回類型和參數類型相符,因為明確的介面實作需要與介面合約精確對應。
- 將介面新增至類別或結構的基底清單,或移除明確的介面實作 (CS0540) 。 類型只能明確實作其繼承列表中所宣告的介面成員,因此,實作類型必須先建立介面關聯性,才能提供明確實作。
泛型型別條件約束
實作具有類型參數條件約束的泛型介面方法時,會發生下列錯誤:
- CS0425: 方法類型參數的條件約束必須符合介面方法類型參數的條件約束。請考慮改用明確的介面實作。
- CS0460: 覆寫和明確介面實作方法的條件約束繼承自基底方法,因此無法直接指定它們,但 'class' 或 'struct' 條件約束除外。
您可以使用下列技術來更正這些錯誤:
- 請確定
where實作方法中的子句與介面方法宣告相同,或符合條件約束的語意意義 (CS0425) 。 實作中的類型參數條件約束必須符合介面或基底方法中定義的條件約束。 - 從覆寫和顯式介面實作中移除顯式約束宣告 (CS0460) 。 覆寫方法會自動從基底或介面方法繼承其條件約束,因此除了 C# 8 和更新版本中允許的特定情況外,重新宣告它們是多餘的且不被允許。
- 在使用 C# 9 或更新版本時,套用
default約束以解決覆寫和顯式介面實作中可為 Null 參考型別的歧義(CS0460)。 條件約束繼承規則的此例外狀況允許您明確指定預設約束,以消除空註釋上下文的歧義。 - 使用 C# 8 或更新版本啟用可為 Null 參考類型註解時,明確地指定
where T : class或where T : struct覆寫及明確介面實作方法的條件約束(CS0460)。 這些特定約束允許支援可 Null 參考類型分析,針對限制為參考或值類型的類型參數。
如需詳細資訊,請參閱 類型參數的條件約束、 介面和 可為 Null 的參考類型。
方法可見性和修飾符
實作具有不正確存取權限或修飾符的介面方法時,會發生下列錯誤:
- CS0736: 成員未實作實例介面成員。它無法實作介面成員,因為它是靜態的。
- CS0737: 成員未實作介面成員。它無法實作介面成員,因為它不是公用的。
您可以使用下列技術來更正這些錯誤:
- 從實作介面成員的方法宣告中移除
static修飾元 (CS0736) 。 在 C# 10 之前,介面成員是實例成員,而不是靜態成員。 - 將存取修飾詞新增至
public實作介面成員的方法 (CS0737) 。 所有介面成員都是隱含的public,因為介面定義了公共行為的合約,因此實作方法也必須具有公共可存取性,才能透過介面參照存取。
存取器的實作與衝突
使用具有可見度問題或命名衝突的存取子方法實作介面屬性或事件時,會發生下列錯誤:
- CS0277: 成員不會實作介面成員,因為它不是公用的。
- CS0470: 方法無法實作類型的介面存取子。請使用明確的介面實作。
- CS0686: 存取子無法實作介面成員。使用明確的介面實作。
您可以使用下列技術來更正這些錯誤:
- 從屬性存取器中移除任何存取修飾詞,若其可見度限制低於
public,或新增缺少的修飾詞public(CS0277)。 所有介面成員都是隱含的public,因此實作存取子也必須具有公用存取權,才能滿足介面合約,並可透過介面類型存取。 - 使用明確的介面實作(CS0470),將名稱類似於存取子的方式(例如
get_PropertyName)的方法替換為正確的屬性語法。 編譯器會在內部產生屬性的存取子方法,而嘗試使用這些保留名稱手動建立方法會與屬性實作機制衝突。 - 當介面包含符合自動產生的存取子方法的方法名稱時,使用明確的介面實作語法來解決命名衝突 (CS0686) 。 編譯器會自動為屬性產生像是
get_Property和set_Property的方法,並為事件產生add_Event和remove_Event的方法,因此如果介面宣告了具有這些完全相同名稱的方法,就需要進行明確實作來消除介面方法與編譯器產生的存取子之間的歧義。
模棱兩可且衝突的實作
當編譯器無法判斷要使用的介面實作時,就會發生下列錯誤:
- CS0473: 明確的介面實作 'method name' 符合多個介面成員。實際選擇的介面成員取決於實作。請考慮改用非明確的實作。
- CS8705: 介面成員 'member' 沒有最具體的實作。兩者都不是最具體的。
您可以使用下列技術來更正這些錯誤:
- 消除明確的介面實作,並改為針對這兩個介面方法使用單一隱含的公用實作 (CS0473) 。 當泛型方法與非泛型方法取得相同的簽章時 (例如,當實作
ITest<int>並且TestMethod(int)和TestMethod(T)變得相同時),通用語言基礎結構的中繼資料系統無法明確判斷哪個介面成員應綁定到哪個實作槽,因此,使用隱式實作可以讓單一的方法滿足這兩個介面的需求。 - 在實作類別或結構中提供明確實作,以解決多個預設實作之間的不明確性 (CS8705)。 此錯誤通常發生在菱形繼承模式中,其中類別實作多個介面,每個介面都會為相同成員提供預設實作。 編譯器需要您明確指定要使用的實作,或提供您自己的實作。
- 重組介面階層,以避免多個介面為相同成員提供預設實作的鑽石繼承衝突 (CS8705) 。 藉由重新設計介面關聯性,或將預設實作合併至單一介面,您可以消除阻止編譯器判斷最具體實作的歧義。
特殊實作限制
使用與介面實作不相容的特殊參數類型時,會發生下列錯誤:
- CS0630: 成員無法實作介面成員,因為它具有 __arglist 參數。
您可以使用下列技術來更正此錯誤:
- 從實作方法 (
__arglist) 中移除參數。 關鍵字__arglist允許方法以非託管方式接受可變數量的引數,但此功能與介面實作不相容,因為介面合約需要可預測的類型安全簽名,這些簽名可以在編譯時進行驗證。 - 將
參數替換為 用於可變長度引數列表的陣列參數( CS0630__arglist,關鍵字 params提供了一種類型安全機制來接受可變數量的參數,該機制與介面實現完全相容,並維護介面所需的編譯時類型安全。