首页 > 解决方案 > C#为什么字典允许属性设置虽然属性是内部设置

问题描述

我正在使用流利的验证 API 来编写验证。

我在课堂上遇到了一处internal set房产ValidationContext

public class ValidationContext {
        public Dictionary<string, object> RootContextData { get; internal set; } = new Dictionary<string, object>();
}

我在这个问题中遇到了内部设置属性。所以,我可以像这样设置字典的值

var rowItemContext = new ValidationContext();
rowItemContext.RootContextData.Add("ab", new object());//this works

上面的代码将一个项目添加到RootcontextData作品中。

但是以下将另一个字典直接分配给 RootContextData 的行会导致编译时错误。

无法将属性或索引器“ValidationContext.RootContextData”分配给——它是只读的

rowItemContext.RootContextData = new Dictionary<string, object>()
            {
                { "ab", new object() }
            };

因此,要将项目字典添加到上下文数据中,我必须遍历要添加的字典。我很惊讶为什么第一个有效但不是直接分配。

标签: c#propertiesaccess-modifierscollection-initializer

解决方案


您似乎对什么是“设置”属性感到困惑。

通常,您仅set在使用该=标志时才对物业进行标记。当您使用赋值运算符时,您实际上是在为属性赋予一个新值。

Dictionary是引用类型,因此该属性存储对字典对象的引用。在这种情况下,属性的值是指向字典的引用。

当您调用 时Add,您只是在修改字典对象,而不是属性的值。该属性的值仍然指向同一个字典对象,因此它保持不变。

当您使用=并创建新字典时,您试图将存储在属性中的引用更改为其他引用。这算作set财产,所以你不能这样做。


推荐阅读