幸福的墨镜 · プロットを利用する — 読書ノート ...· 2 月前 · |
坚韧的花生 · 男子跟着“导师”炒股 ...· 2 月前 · |
踏实的水煮鱼 · 走进前端 Vscode和插件的安装 ...· 5 月前 · |
朝气蓬勃的足球 · Camunda Transaction ...· 5 月前 · |
文雅的海龟 · 同时接收两条websocket消息,只回调了 ...· 7 月前 · |
ref
、
out
或
in
主构造函数参数。
ref
或
out
值(在该类型的仅限 init 的资源库中或变量初始值设定项除外)。
此外,本文还介绍了以下警告:
最多可为一种类型编写一个静态构造函数。 静态构造函数的声明必须遵循以下规则:
static
修饰符,但不具有其他修饰符,例如
public
、
protected
、
private
或
internal
。
base()
或
this()
。 如果基类包含静态构造函数,运行时会自动调用它。
构造函数仅允许在
class
和
struct
类型中使用,包括
record class
和
record struct
类型。 不能在
enum
或
interface
类型中定义它们。 此外,
属性
类类型无法声明
in
参数, 而是按值传递参数。
可以声明
extern
构造函数,但无法使用
base()
或
this()
构造函数调用来从声明为
extern
的构造函数中调用另一个构造函数。
此外,还可能针对构造函数声明生成以下警告:
当构造函数标记为
extern
时,编译器无法保证构造函数是否存在。 因此,编译器会生成此警告。
C# 中的最新功能移除了对
struct
类型的限制。 在旧版本的 C# 中声明无参数实例构造函数时,会生成 CS0568
。 使用 C# 10 后,可以声明显式的无参数实例构造函数。 该显式的无参数构造函数必须是
public
。 如果
struct
声明了任何
字段初始化表达式
,你还必须声明显式实例构造函数。 此构造函数可以是主体为空的无参数构造函数。
当
struct
类型声明主构造函数(包括
record struct
类型)时,除无参数构造函数以外的所有其他实例构造函数必须使用
this()
调用主构造函数或其他显式声明的构造函数。
base
和
this
进行构造函数调用
可以使用
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
修饰符添加到 struct
或 class
类型会创建记录。 记录包括编译器合成的复制构造函数。 可以自行编写显式复制构造函数,但它必须遵循以下规则:
复制构造函数必须是 public
或 protected
,除非类型为 sealed
。
复制构造函数必须调用 base()
复制构造函数,除非基类为 System.Object。
此外,基类型必须具有复制构造函数。 record
类型始终具有复制构造函数。
主构造函数声明
当主构造函数违反针对类和结构的主构造函数的一条或多条规则时,编译器会发出以下错误:
CS8861:意外的参数列表。
CS8862:在带参数列表的类型中声明的构造函数必须具有“this”构造函数初始值设定项。
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:意外的参数列表。
CS9124:参数被捕获到封闭类型的状态中,其值还会用于初始化字段、属性或事件。
CS9136:无法在实例成员内使用类型的主构造函数参数。
主构造函数参数在该类型的主体范围内。 编译器可以合成一个字段,该字段存储可在成员或字段初始值设定项中使用的参数。 由于主构造函数参数可能会复制到字段中,因此存在以下限制:
主构造函数可以在 struct
和 class
类型上声明,但不能在 interface
类型上声明。
主构造函数参数不能在 base()
构造函数调用中使用,除非作为主构造函数的一部分。
无法在 Lambda 表达式、查询表达式或本地函数中访问 ref struct
类型的主构造函数参数。
如果类型不是 ref struct
,则无法在实例成员中访问 ref struct
参数。
在 ref struct
类型中,具有 in
、ref
或 out
修饰符的主构造函数参数不能用于任何实例方法或属性访问器。
对于主构造函数参数,结构类型具有以下额外限制:
不能在 Lambda 表达式、查询表达式或本地函数中捕获主构造函数参数。
主构造函数参数不能按引用返回(ref
返回或 readonly ref
返回)。
对于主构造函数参数,只读结构类型具有以下额外限制:
不能在 readonly
结构中重新分配主构造函数参数及其成员。
不能在 readonly
结构中对主构造函数参数及其成员进行 ref
返回。
主构造函数形参及其成员不能是任何方法的 ref
或 out
实参。
在所有这些情况下,有关主构造函数参数的限制与有关这些类型中的数据字段的限制一致。 之所以存在这些限制,是因为主构造函数参数可能会转换为类型中的合成字段。 因此,主构造函数参数必须遵循应用于该合成字段的规则。
派生的主构造函数通过向基础构造函数提供参数来调用基础主构造函数。 你必须使用派生的构造函数声明中的参数名称。
这些警告提供有关捕获或隐藏的主构造函数参数的指导。
CS9107:参数被捕获到封闭类型的状态中,其值也会传递到基构造函数。基类可能也会捕获该值。此警告指示可能会向代码分配两个主构造函数参数副本。 由于参数会传递给基类,因此基类可能会使用它。 由于派生类会访问它,因此它可能具有同一参数的第二个副本。 此额外存储空间可能不是预期结果。
CS9113:参数未读。此警告表示类从未引用主构造函数,甚至从未将其传递给基主构造函数。 它可能是不必要的。
CS9124:参数被捕获到封闭类型的状态中,其值还会用于初始化字段、属性或事件。此警告指示封闭类型还会捕获嵌套类型的构造函数参数。 该参数可能存储两次。
CS9179:主构造函数参数被基成员隐藏
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:https://aka.ms/ContentUserFeedback。
提交和查看相关反馈