You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何强制继承的C# Record通过属性初始化器初始化属性?

C# Record 强制派生类通过属性初始化器初始化属性的方案

你需要让抽象Record的派生类必须在内部通过属性初始化器完成heading属性的初始化,而非依赖构造函数或外部对象初始化器。可以通过以下方式实现:

核心思路

将抽象Record中的heading定义为抽象只读属性,利用C#的明确赋值检查机制,强制派生类必须在属性初始化器中为其赋值——因为只读属性只能在类内部的属性初始化器或构造函数中赋值,若不自定义构造函数,就只能通过属性初始化器完成初始化。

代码实现

抽象Record定义

internal abstract record TaskManagerLocalization
{
    // 抽象只读属性,强制派生类实现并赋值
    internal abstract string Heading { get; }
}

符合要求的派生Record

internal record TaskManagerJapaneseLocalization : TaskManagerLocalization
{
    // 必须通过属性初始化器赋值,否则编译报错
    internal override string Heading { get; } = "タスクマネージャー";
}

错误示例(编译不通过)

如果派生类省略属性初始化器,C#编译器会抛出明确赋值错误:

internal record TaskManagerJapaneseLocalization : TaskManagerLocalization
{
    // 编译错误:非静态字段、方法或属性 'TaskManagerJapaneseLocalization.Heading' 必须包含明确赋值
    internal override string Heading { get; };
}

说明

  • 这里使用只读属性(get;)而非init;,是为了避免派生类的实例被外部通过对象初始化器修改Heading值,确保属性值只能在类内部初始化时确定。
  • 若你需要保留init的可初始化特性但仍强制内部初始化,可以将派生类的构造函数设为私有并通过工厂方法创建实例,但上述方案更直接满足你的核心需求。

内容的提问来源于stack exchange,提问作者Takeshi Tokugawa YD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 14:18:13