共用方式為


partial 類型和 partial 成員宣告相關的錯誤和警告

有許多與 類型和 partial 成員宣告相關的partial

  • CS0260類型宣告中遺失部分修飾詞;但此類型的另一個部分宣告存在
  • CS0261:類型的部分宣告必須全部為類別、全部為結構,或全部為介面
  • CS0262類型的部分宣告有衝突的存取範圍修飾詞
  • CS0263類型的部分宣告不可指定不同的基底類別
  • CS0264類型的部分宣告必須有相同順序的相同類型參數名稱
  • CS0265類型的部分宣告對類型參數 'type parameter' 有不一致的條件約束
  • CS0267'partial' 修飾詞只能出現在 'class'、'record'、'struct'、'interface' 或方法或屬性傳回類型之前。
  • CS0282在多個部分類別或結構 'type' 的宣告中,欄位沒有明確的排序。要指定排序,所有執行個體欄位必須在同一個宣告中。
  • CS0501'member function' 不是標記成 abstractexternpartial,因此必須宣告主體
  • CS0750部分成員不能具有 'abstract' 修飾詞。
  • CS0751部分成員必須在部分 class 或部分 struct 中宣告
  • CS0754部分成員不可明確地實作介面方法。
  • CS0755兩個部分方法宣告必須都是擴充方法,或者都不是擴充方法。
  • CS0756部分方法不可有多重定義宣告。
  • CS0757部分方法不能有多重實作的宣告。
  • CS0759找不到用以實作部分方法宣告的定義宣告。
  • CS0761method<T> 的部分方法的宣告具有不一致的類型參數條件約束。
  • CS0762無法從方法建立委派,因為它是無實作宣告的部分方法
  • CS0763兩個部分方法宣告必須都是 static,或者都不是 static
  • CS0764兩個部分方法宣告必須都是 unsafe,或者都不是 unsafe
  • CS1067部分宣告必須有相同順序的相同類型參數名稱和變數修飾詞。
  • CS8142兩個部分成員宣告必須使用相同的元組元素名稱。
  • CS8663兩個部分成員宣告必須都使用唯讀修飾詞,或者都不使用唯讀修飾詞
  • CS8796部分方法必須具有存取修飾詞,因為它有非無效的傳回類型。
  • CS8795部分成員必須具有實作部分,因為它具有存取修飾詞。
  • CS8797部分方法必須具有存取修飾詞,因為它具有 'out' 參數。
  • CS8798部分方法必須具有存取修飾詞,因為它具有 'virtual'、'override'、'sealed'、'new' 或 'extern' 修飾詞。
  • CS8799兩個部分成員宣告必須具有相同的存取修飾詞。
  • CS8800兩個部分成員宣告必須具有相同的 virtualoverridesealednew 修飾詞組合。
  • CS8817兩個部分方法宣告必須具有相同的傳回類型。
  • CS8818部分成員宣告必須具有相符的 ref 傳回值。
  • CS8863只有單一部分類型宣告可以有參數清單
  • CS8988參數的 scoped 修飾詞與部分定義不相符。
  • CS9248部分屬性必須具有實作部分。
  • CS9249部分屬性必須具有定義部分。
  • CS9250部分屬性不能有多個定義宣告,並且不能是自動屬性。
  • CS9251部分屬性不能有多重實作的宣告
  • CS9252屬性存取子必須實作,因為它是在定義部分宣告的
  • CS9253屬性存取子未實作定義部分中宣告的任何存取子
  • CS9254屬性存取子必須與定義部分相符
  • CS9255兩個部分屬性宣告必須具有相同的類型。
  • CS9256部分屬性宣告的簽章不同。
  • CS9257兩個部分屬性宣告必須都為必要,或者都不為必要
  • CS9258在此語言版本中,'field' 關鍵詞會系結至屬性的合成支援字段。若要避免產生合成支援欄位,並參考現有的成員,請改用'this.field' 或 '@field' 。
  • CS9263部分屬性在定義和實作上都不能有初始化表達式。
  • CS9275部分成員必須具有實作元件。
  • CS9276部分成員必須具有定義元件。
  • CS9277部分成員不允許有多個定義宣告。
  • CS9278部分成員可能沒有多個實作宣告。
  • CS9279部分事件不能有初始化表達式。
  • CS9280只有部分建構函式的實作宣告可以有初始化表達式。

您可以針對欄位支援的屬性產生下列警告:

  • CS9264結束建構函式時,不可為 Null 的屬性必須包含非 Null 值。請考慮新增 『required』 修飾詞,或將屬性宣告為可為 Null,或新增 『[field: MaybeNull, AllowNull]' 屬性。*
  • CS9266屬性的一個存取子應該使用 『field',因為另一個存取子正在使用它。
  • CS9273在此語言版本中,'field' 是屬性存取子內的關鍵詞。請重新命名變數,或使用標識碼 『@field

以下各節將說明這些錯誤和警告的原因及其修正方法。

部分型別

  • CS0260類型宣告中遺失部分修飾詞;但此類型的另一個部分宣告存在
  • CS0261:類型的部分宣告必須全部為類別、全部為結構,或全部為介面
  • CS0262類型的部分宣告有衝突的存取範圍修飾詞
  • CS0263類型的部分宣告不可指定不同的基底類別
  • CS0264類型的部分宣告必須有相同順序的相同類型參數名稱
  • CS0265類型的部分宣告對類型參數 'type parameter' 有不一致的條件約束
  • CS0267'partial' 修飾詞只能出現在 'class'、'record'、'struct'、'interface' 或方法或屬性傳回類型之前。
  • CS8863只有單一部分類型宣告可以有參數清單

您的部分類型宣告可能會導致編譯器發出以下警告:

  • CS0282在多個部分 classstruct 'type' 的宣告中,欄位沒有明確的排序。要指定排序,所有執行個體欄位必須在同一個宣告中。

對於任何部分類型,partial 關鍵字必須緊接在 classrecordstructinterface 之前。 如果它以任何其他順序出現,編譯器會發出錯誤。 此外:

  • 所有部分類型的宣告必須在類型 (classstructrecord classrecord structreadonly structreadonly record struct) 方面一致。
  • 所有宣告都必須包含 partial 修飾詞。
  • 泛型部分類型的宣告必須包含相同的類型參數,且順序必須一致。

宣告中的某些部分不需要在類型的所有宣告中重複。 然而,如果這些元素在多個 partial 宣告中重複,它們必須符合:

  • 任何存取修飾詞,例如 public
  • 任何基底類別或實作的介面。
  • 任何類型參數的條件約束

部分類型的宣告中最多只能宣告一次主要建構函式。

如果您在多個檔案中為 partial struct 類型宣告了多個欄位,編譯器會發出警告。 如果版面配置順序很重要,您必須在同一個檔案中宣告所有欄位。 如果順序不重要,您可以使用 System.Runtime.InteropServices.StructLayoutAttribute 搭配 LayoutKind.Auto 值。

部分成員

  • CS0750部分成員不能具有 'abstract' 修飾詞。
  • CS0751部分成員必須在部分 class 或部分 struct 中宣告
  • CS0754部分成員不可明確地實作介面方法。
  • CS0763兩個部分方法宣告必須都是 static,或者都不是 static
  • CS0764兩個部分方法宣告必須都是 unsafe,或者都不是 unsafe
  • CS8142兩個部分成員宣告必須使用相同的元組元素名稱。
  • CS8663兩個部分成員宣告必須都使用唯讀修飾詞,或者都不使用唯讀修飾詞
  • CS8799兩個部分成員宣告必須具有相同的存取修飾詞。
  • CS8800兩個部分成員宣告必須具有相同的 virtualoverridesealednew 修飾詞組合。
  • CS8818部分成員宣告必須具有相符的 ref 傳回值。
  • CS8988參數的 scoped 修飾詞與部分定義不相符。
  • CS9275部分成員必須具有實作元件。
  • CS9276部分成員必須具有定義元件。
  • CS9277部分成員不得有多個定義宣告。
  • CS9278部分成員不可有多個實作宣告。

部分成員必須有兩個宣告。 沒有實作的宣告是 定義宣告。 具有實作的宣告是實作宣告。 這兩個宣告都是必要的。 部分成員僅允許在 partial 類型中。 部分成員不能是 abstract。 部分成員不能明確實作介面。 部分成員的兩個宣告必須具有相同的簽章。 例如,兩個宣告不是都包含 staticunsafe 修飾詞,就是都不包含。

部分方法

  • CS0501'member function' 不是標記成 abstractexternpartial,因此必須宣告主體
  • CS0755兩個部分方法宣告必須都是擴充方法,或者都不是擴充方法。
  • CS0756部分方法不可有多重定義宣告。
  • CS0757部分方法不能有多重實作的宣告。
  • CS0759找不到用以實作部分方法宣告的定義宣告。
  • CS0761method<T> 的部分方法的宣告具有不一致的類型參數條件約束。
  • CS0762無法從方法建立委派,因為它是無實作宣告的部分方法
  • CS1067部分宣告必須有相同順序的相同類型參數名稱和變數修飾詞。
  • CS8796部分方法必須具有存取修飾詞,因為它有非無效的傳回類型。
  • CS8795部分成員必須具有實作部分,因為它具有存取修飾詞。
  • CS8797部分方法必須具有存取修飾詞,因為它具有 'out' 參數。
  • CS8798部分方法必須具有存取修飾詞,因為它具有 'virtual'、'override'、'sealed'、'new' 或 'extern' 修飾詞。
  • CS8817兩個部分方法宣告必須具有相同的傳回類型。

某些 partial 方法宣告不需要實作宣告。 也就是說,如果該成員傳回 void,未宣告任何存取修飾詞(包括預設的 private 修飾詞),並且不包含任何 virtualoverridesealednew 修飾詞。 否則,任何部分方法必須包含宣告宣告和實作宣告。

當部分方法包含實作宣告時,兩個宣告必須完全相同。 只能定義一個實作宣告。

當您有實作宣告 (具有主體的部分方法),但沒有對應的定義宣告 (沒有主體的方法簽章) 時,就會發生 CS0759 。 具有實作的每個部分方法都必須有這兩個宣告。

下列範例顯示產生 CS0759 的程式代碼:

// This will cause CS0759: No defining declaration found for implementing declaration of partial method.
// Uncomment the class below to see the CS0759 error:
/*
public partial class ExampleClass
{
    // ERROR: This is an implementing declaration without a corresponding defining declaration
    partial void MyMethod() // CS0759
    {
        Console.WriteLine("Implementation without definition");
    }
}
*/

若要修正此錯誤,請新增定義宣告:

// Correct way: Provide both the defining declaration and implementing declaration
public partial class CorrectExampleClass
{
    // Defining declaration (signature without body)
    partial void MyMethod();
}

public partial class CorrectExampleClass
{
    // Implementing declaration (signature with body)
    partial void MyMethod()
    {
        Console.WriteLine("This works correctly");
    }
}

您也可以將這兩個宣告放在相同的部分類別區段中:

// Alternative correct approach: defining and implementing in same partial class
public partial class AlternativeExampleClass
{
    // Defining declaration
    partial void MyMethod();
    
    // Implementing declaration in same partial class section
    partial void MyMethod()
    {
        Console.WriteLine("This also works correctly");
    }
}

部分屬性

以下錯誤表示部分屬性或索引器宣告中的錯誤:

  • CS9248部分屬性必須具有實作部分。
  • CS9249部分屬性必須具有定義部分。
  • CS9250部分屬性不能有多個定義宣告,並且不能是自動屬性。
  • CS9251部分屬性不能有多重實作的宣告
  • CS9252屬性存取子必須實作,因為它是在定義部分宣告的
  • CS9253屬性存取子未實作定義部分中宣告的任何存取子
  • CS9254屬性存取子必須與定義部分相符
  • CS9255兩個部分屬性宣告必須具有相同的類型。
  • CS9257兩個部分屬性宣告必須都為必要,或者都不為必要

以下警告表示部分屬性中宣告宣告和實作宣告的簽章差異:

  • CS9256部分屬性宣告的簽章不同。

部分屬性或索引器必須同時 具有宣告宣告實作宣告。 兩個宣告的簽章必須一致。 由於宣告宣告使用與自動實作屬性相同的語法,因此實作宣告不能是自動實作的屬性。 存取子必須至少有一個存取子主體。 從 C# 13 開始,您可以使用 field 關鍵詞,使用簡潔的語法來宣告一個存取子:

public partial int ImplementingDeclaration { get => field; set; }

部分事件和建構函式

  • CS9279部分事件不能有初始化表達式。
  • CS9280只有部分建構函式的實作宣告可以有初始化表達式。

你在部分建構子的定義宣告或部分事件宣告上宣告初始化器。 您必須將其移除。

欄位支援的屬性

  • CS9258在此語言版本中,'field' 關鍵詞會系結至屬性的合成支援字段。若要避免產生合成支援欄位,並參考現有的成員,請改用'this.field' 或 '@field' 。
  • CS9263部分屬性在定義和實作上都不能有初始化表達式。
  • CS9264結束建構函式時,不可為 Null 的屬性必須包含非 Null 值。請考慮新增 『required』 修飾詞,或將屬性宣告為可為 Null,或新增 『[field: MaybeNull, AllowNull]' 屬性。*
  • CS9266屬性的一個存取子應該使用 『field',因為另一個存取子正在使用它。
  • CS9273在此語言版本中,'field' 是屬性存取子內的關鍵詞。請重新命名變數,或使用標識碼 『@field

從 C# 14 開始,field 具備 backing 的屬性允許你存取編譯器合成的後設欄位。 CS9258CS9273 表示您有名為 field的變數,此變數可由內容關鍵詞 field隱藏。

CS9263 表示宣告包含 實作。 該實作可能會存取該屬性的編譯程式合成支援欄位。 CS9264 表示在您使用 field 時假設了一個不可空的後端欄位,但屬性宣告是可空的。 編譯程式假設支援欄位和屬性具有相同的可為 Null 性。 您必須將 [field:MaybeNull, AllowNull] 屬性新增至屬性宣告,以 field 指出值應該視為可為 Null。 CS9266 表示一個屬性的存取者使用關鍵字 field ,但另一個則使用手動宣告的背景欄位。 警告顯示這可能是錯誤。