• CS0514 :静态构造函数无法具有显式“this”或“base”构造函数调用
  • CS0515 :静态构造函数中不允许出现访问修饰符。
  • CS0516 :构造函数“constructor”无法调用其自身。
  • CS0517 :“class”没有基类,无法调用基构造函数。
  • CS0522 :结构无法调用基类构造函数
  • CS0526 :接口无法包含构造函数
  • CS0568 :结构无法包含显式无参数构造函数。
  • CS0710 :静态类不能有实例构造函数。
  • CS0768 :构造函数无法通过另一构造函数调用自身。
  • CS8054 :枚举无法包含显式无参数构造函数。
  • CS8091 :不能是外部的,也不能具有构造函数初始值设定项。
  • CS8861 :意外的参数列表。
  • CS8862 :在带参数列表的类型中声明的构造函数必须具有“this”构造函数初始值设定项。
  • CS8358 :无法使用属性构造函数,因为它具有“in”参数。
  • CS8867 :在基类型“{0}”中找不到可访问的复制构造函数。
  • CS8868 :如果记录继承自对象,则记录中的复制构造函数必须调用基对象的复制构造函数,或者调用无参数对象构造函数。
  • CS8878 :复制构造函数“{0}”必须是公共的或受保护的,因为该记录未密封。
  • CS8910 :主构造函数与合成的复制构造函数冲突。
  • CS8958 :无参数结构构造函数必须是“public”
  • CS8982:在带参数列表的“结构”中声明的构造函数必须具有调用主构造函数或显式声明的构造函数的“this”初始值设定项。
  • CS8983 :具有字段初始值设定项的“结构”必须包含显式声明的构造函数。
  • CS9105 :无法在此上下文中使用主构造函数参数。
  • CS9106 :在此上下文中,类型和参数之间的标识符不明确。类也是如此。 *
  • CS9108 :无法在匿名方法、Lambda 表达式、查询表达式或本地函数中使用具有类 ref 类型的参数。
  • CS9109:无法在实例成员中使用 ref out in 主构造函数参数。
  • CS9110:无法在实例成员中使用具有类 ref 类型的主构造函数参数。
  • CS9111:结构的实例成员中的匿名方法、Lambda 表达式、查询表达式和本地函数无法访问主构造函数参数。
  • CS9112:结构中的匿名方法、Lambda 表达式、查询表达式和本地函数无法访问同时在实例成员中使用的主构造函数参数。
  • CS9114:无法为只读类型的主构造函数参数赋值(在该类型的仅限 init 的资源库中或变量初始值设定项除外)。
  • CS9115 :只读类型的主构造函数参数无法通过可写引用返回。
  • CS9116 :无法将只读类型的主构造函数参数用作 ref 或 out 值(在该类型的仅限 init 的资源库中或变量初始值设定项除外)。
  • CS9117 :无法修改只读类型的主构造函数参数的成员(在该类型的仅限 init 的资源库中或变量初始值设定项除外)。
  • CS9118:只读类型的主构造函数参数的成员无法通过可写引用返回。
  • CS9119:无法将只读类型的主构造函数参数的成员用作 ref out 值(在该类型的仅限 init 的资源库中或变量初始值设定项除外)。
  • CS9120:无法按引用返回主构造函数参数。
  • CS9121:类型的结构主构造函数参数导致结构布局中出现循环。
  • CS9122 :意外的参数列表。
  • CS9136 :无法在实例成员内使用类型的主构造函数参数。
  • 此外,本文还介绍了以下警告:

  • CS0824 :构造函数“name”标记为外部对象。
  • CS9107 :参数被捕获到封闭类型的状态中,其值也会传递到基构造函数。 基类可能也会捕获该值。
  • CS9113 :参数未读。
  • CS9124 :参数被捕获到封闭类型的状态中,其值还会用于初始化字段、属性或事件。
  • CS9179 :主构造函数参数被基成员隐藏
  • 静态构造函数

  • CS0514:静态构造函数无法具有显式“this”或“base”构造函数调用
  • CS0515:静态构造函数中不允许出现访问修饰符
  • 最多可为一种类型编写一个静态构造函数。 静态构造函数的声明必须遵循以下规则:

  • 静态构造函数具有 static 修饰符,但不具有其他修饰符,例如 public protected private internal
  • 静态构造函数必须是无参数构造函数。
  • 静态构造函数不得调用 base() this() 。 如果基类包含静态构造函数,运行时会自动调用它。
  • 构造函数声明

  • CS0526:接口无法包含构造函数。
  • CS0710:静态类不能有实例构造函数。
  • CS8054:枚举无法包含显式无参数构造函数。
  • CS8358:无法使用属性构造函数,因为它具有“in”参数。
  • CS8091:构造函数不能是外部的,也不能具有构造函数初始值设定项。
  • 构造函数仅允许在 class struct 类型中使用,包括 record class record struct 类型。 不能在 enum interface 类型中定义它们。 此外, 属性 类类型无法声明 in 参数, 而是按值传递参数。

    可以声明 extern 构造函数,但无法使用 base() this() 构造函数调用来从声明为 extern 的构造函数中调用另一个构造函数。

    此外,还可能针对构造函数声明生成以下警告:

  • CS0824:构造函数标记为外部对象。
  • 当构造函数标记为 extern 时,编译器无法保证构造函数是否存在。 因此,编译器会生成此警告。

    结构类型中的构造函数

  • CS0568:结构无法包含显式无参数构造函数。
  • CS8958:无参数结构构造函数必须是“public”。
  • CS8982:在带参数列表的“结构”中声明的构造函数必须具有调用主构造函数或显式声明的构造函数的“this”初始值设定项。
  • CS8983:具有字段初始值设定项的“结构”必须包含显式声明的构造函数。
  • C# 中的最新功能移除了对 struct 类型的限制。 在旧版本的 C# 中声明无参数实例构造函数时,会生成 CS0568 。 使用 C# 10 后,可以声明显式的无参数实例构造函数。 该显式的无参数构造函数必须是 public 。 如果 struct 声明了任何 字段初始化表达式 ,你还必须声明显式实例构造函数。 此构造函数可以是主体为空的无参数构造函数。

    struct 类型声明主构造函数(包括 record struct 类型)时,除无参数构造函数以外的所有其他实例构造函数必须使用 this() 调用主构造函数或其他显式声明的构造函数。

    使用 base this 进行构造函数调用

  • CS0516:构造函数无法调用其自身。
  • CS0517:Class 没有基类,无法调用基构造函数。
  • CS0522:结构无法调用基类构造函数。
  • CS0768:构造函数无法通过另一构造函数调用自身。
  • 可以使用 base() this() 完成一个构造函数对另一个相同类型或基类型的构造函数的调用。 调用构造函数可以最大程度地减少重复的构造函数逻辑。 在使用 this() base() 调用其他构造函数时,必须遵循以下规则:

  • 构造函数无法通过另一个构造函数直接或间接地调用自身。 例如,以下代码是非法的:

    public class C
      public C() : this() // Error!
    public class C2
      public class C2() : this(10) {}
      public class C2(int capacity) : this() 
          _capacity = capacity;
      private int _capacity;
    
  • 结构类型无法调用 base()System.Object 也无法调用。

    记录和复制构造函数

  • CS8867:在基类型中找不到可访问的复制构造函数。
  • CS8868:如果记录继承自对象,则记录中的复制构造函数必须调用基对象的复制构造函数,或者调用无参数对象构造函数。
  • CS8878:复制构造函数必须是公共的或受保护的,因为该记录未密封。
  • CS8910:主构造函数与合成的复制构造函数冲突。
  • record 修饰符添加到 structclass 类型会创建记录。 记录包括编译器合成的复制构造函数。 可以自行编写显式复制构造函数,但它必须遵循以下规则:

  • 复制构造函数必须是 publicprotected,除非类型为 sealed
  • 复制构造函数必须调用 base() 复制构造函数,除非基类为 System.Object
  • 此外,基类型必须具有复制构造函数。 record 类型始终具有复制构造函数。
  • 主构造函数声明

    当主构造函数违反针对类和结构的主构造函数的一条或多条规则时,编译器会发出以下错误:

  • CS8861:意外的参数列表。
  • CS8862:在带参数列表的类型中声明的构造函数必须具有“this”构造函数初始值设定项。
  • CS9105:无法在此上下文中使用主构造函数参数。
  • CS9106:在此上下文中,类型和参数之间的标识符不明确。
  • CS9108:无法在匿名方法、Lambda 表达式、查询表达式或本地函数中使用具有类 ref 类型的参数。
  • CS9109:无法在实例成员中使用 refoutin 主构造函数参数。
  • CS9110:无法在实例成员中使用具有类 ref 类型的主构造函数参数。
  • CS9111:结构的实例成员中的匿名方法、Lambda 表达式、查询表达式和本地函数无法访问主构造函数参数。
  • CS9112:结构中的匿名方法、Lambda 表达式、查询表达式和本地函数无法访问同时在实例成员中使用的主构造函数参数。
  • CS9114:无法为只读类型的主构造函数参数赋值(在该类型的仅限 init 的资源库中或变量初始值设定项除外)。
  • CS9115:只读类型的主构造函数参数无法通过可写引用返回。
  • CS9116:无法将只读类型的主构造函数参数用作 refout 值(在该类型的仅限 init 的资源库中或变量初始值设定项除外)。
  • CS9117:无法修改只读类型的主构造函数参数的成员(在该类型的仅限 init 的资源库中或变量初始值设定项除外)。
  • CS9118:只读类型的主构造函数参数的成员无法通过可写引用返回。
  • CS9119:无法将只读类型的主构造函数参数的成员用作 refout 值(在该类型的仅限 init 的资源库中或变量初始值设定项除外)。
  • CS9120:无法按引用返回主构造函数参数。
  • CS9121:类型的结构主构造函数参数导致结构布局中出现循环。
  • CS9122:意外的参数列表。
  • CS9124:参数被捕获到封闭类型的状态中,其值还会用于初始化字段、属性或事件
  • CS9136:无法在实例成员内使用类型的主构造函数参数。
  • 主构造函数参数在该类型的主体范围内。 编译器可以合成一个字段,该字段存储可在成员或字段初始值设定项中使用的参数。 由于主构造函数参数可能会复制到字段中,因此存在以下限制:

  • 主构造函数可以在 structclass 类型上声明,但不能在 interface 类型上声明。
  • 主构造函数参数不能在 base() 构造函数调用中使用,除非作为主构造函数的一部分。
  • 无法在 Lambda 表达式、查询表达式或本地函数中访问 ref struct 类型的主构造函数参数。
  • 如果类型不是 ref struct,则无法在实例成员中访问 ref struct 参数。
  • ref struct 类型中,具有 inrefout 修饰符的主构造函数参数不能用于任何实例方法或属性访问器。
  • 对于主构造函数参数,结构类型具有以下额外限制:

  • 不能在 Lambda 表达式、查询表达式或本地函数中捕获主构造函数参数。
  • 主构造函数参数不能按引用返回(ref 返回或 readonly ref 返回)。
  • 对于主构造函数参数,只读结构类型具有以下额外限制:

  • 不能在 readonly 结构中重新分配主构造函数参数及其成员。
  • 不能在 readonly 结构中对主构造函数参数及其成员进行 ref 返回。
  • 主构造函数形参及其成员不能是任何方法的 refout 实参。
  • 在所有这些情况下,有关主构造函数参数的限制与有关这些类型中的数据字段的限制一致。 之所以存在这些限制,是因为主构造函数参数可能会转换为类型中的合成字段。 因此,主构造函数参数必须遵循应用于该合成字段的规则。

    派生的主构造函数通过向基础构造函数提供参数来调用基础主构造函数。 你必须使用派生的构造函数声明中的参数名称。

    这些警告提供有关捕获或隐藏的主构造函数参数的指导。

  • CS9107:参数被捕获到封闭类型的状态中,其值也会传递到基构造函数。基类可能也会捕获该值。此警告指示可能会向代码分配两个主构造函数参数副本。 由于参数会传递给基类,因此基类可能会使用它。 由于派生类会访问它,因此它可能具有同一参数的第二个副本。 此额外存储空间可能不是预期结果。
  • CS9113:参数未读。此警告表示类从未引用主构造函数,甚至从未将其传递给基主构造函数。 它可能是不必要的。
  • CS9124:参数被捕获到封闭类型的状态中,其值还会用于初始化字段、属性或事件。此警告指示封闭类型还会捕获嵌套类型的构造函数参数。 该参数可能存储两次。
  • CS9179:主构造函数参数被基成员隐藏
  • 即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:https://aka.ms/ContentUserFeedback

    提交和查看相关反馈

  •