考虑以下具有只读(或只读)属性ClientPermissions的类:

internal class Client
{
    public string? ClientId { get; set; }

    public HashSet<string> ClientPermissions { get; } = new(StringComparer.Ordinal);

    public HashSet<string> ClientTokens { get; set; } = new(StringComparer.Ordinal);

}

我似乎不能在构造期间将对象分配给只读自动属性ClientPermission,而我可以使用匿名集合初始值设定项为其赋值

SO 5646285给出一个提示 对于对象初始值设定项,DotNet编译器实际上将其编译为使用对象创建,然后再添加这些值.

好的...但是为什么我可以使用匿名集合初始值设定项而不是这个只读自动属性呢?

        // Works - no complaints from compiler when I use collection initializer on read-only auto-property ClientPermissions
        var sc1 = new Client() { ClientId = "c1", ClientPermissions = { "a1", "b1" }, ClientTokens = { "t1", "t2" } };

        // Works - no complaints from compiler when I use collection initializer on read-only auto-property and object initializer on normal/full auto-property
        var sc2 = new Client() { ClientId = "c2", ClientPermissions = { "a1", "b1" }, ClientTokens = new HashSet<string>{ "t1", "t2" } };

        // DOES NOT COMPILE - Compiler complains with a CS0200: Property or indexer '...' cannot be assigned to -- it is readonly
        // auto-initialize syntax 
        var sc3 = new Client() { ClientId = "c3", ClientPermissions = new HashSet<string> { "a1", "b1" }, ClientTokens = new HashSet<string> { "t1", "t2" } };

推荐答案

这是在ClientPermissions引用的对象上调用Add方法:

ClientPermissions = { "a1", "b1" }

它不会将新对象分配给该属性,因此允许这样做.

相反,这是无效的,因为在构造后不能将新对象分配给该属性:

ClientPermissions = new HashSet { "a1", "b1" }

相关文档为here.

Csharp相关问答推荐

ASP.NET Core 8 Cors标题未显示

C# uwp中的Win11启动屏幕剪辑工作方式不同

HttpContext. RequestAborted当Android APP失go 连接时未取消

当我使用NET6作为目标框架时,为什么DotNet使用NET8作为MS包?

为什么在ANTLR4中会出现不匹配的输入错误?""

使页面内容居中

发布用于Linux Ubuntu的C#应用程序

如何使用新的Microsoft.IdentityModel.JsonWebToken创建JwtSecurityToken?

在静态模式下实例化配置

如何注册类使用多级继承与接口

C#-VS2022:全局使用和保存时的代码清理

用于管理System.Text.Json中的多态反序列化的自定义TypeInfoResolver

为值对象编写自定义JsonConverter

在C#.NET项目中启动时,如何等待提升的PowerShell进程退出?

WPF动态设置弹出窗口水平偏移

将两个for循环更改为一条LINQ语句

如果所有";async任务方法()";调用都返回Task.FromResult()-是否同步执行?

这是T自身的布尔表达式是什么意思?

Avalonia MVVM数据模板

如何获取我在SQL中输入的值