在 C# 10.0 中启用了可为空的仅初始化引用属性

Init-only reference properties with nullable enabled in C# 10.0

我尝试使用仅初始化属性来强制客户端代码在创建 class 时初始化它,但没有构造函数。它没有按我的计划工作。

这里是 class,精简以说明这一点。

public class Target
{
    public int              Id               { get; init; }
    public string           Name             { get; init; }
}

该项目基于 .NET 6.0,因此我使用的是 C# 10.0。 Nullable 在项目中设置为“已启用”,因此引用 属性 Name 必须 为非空。令我困惑的是,编译器抱怨 constructor.

之后的 Name 属性 可能为空
CS8618: Non-nullable property 'Name' must contain a non-null value when exiting constructor

这当然是真的,但是使用仅初始化 属性 的全部意义在于我不 想要 构造函数。我想强迫人们使用 init-only 属性将 Name 初始化为有效的东西。如果我想写一个构造函数,我可以只写一个只读的 属性.

(我意识到我可以将 Name 默认为 string.Empty 或我自己的一些其他有效值,但我想强制编码员这样做)

C# 10.0 是否提供了一种方法来实现我想要的而无需执行以下任何操作?

这可行吗?

我对这个主题的搜索让我找到了 this post,但我能从中得到的最好结果是 link 到 Mads Torgensen 的博客,讨论他们计划在 C# 10 中做什么。是否有有更新吗?

init 属性不会 force 要初始化的值,只有构造函数会这样做。 init的作用是,如果要初始化属性,必须在构造时完成对象初始值设定项(或在构造函数中,如果有的话):它不保证它会。

如果你想在这里获得最大的稳健性,请改为通过构造函数初始化它们,这允许你添加保护子句并保证不可为 null 的属性。

这就是你想要的(我也是):

This proposal adds a way of specifying that a property or field is required to be set during object initialization, forcing the instance creator to provide an initial value for the member in an object initializer at the creation site.