内联列表如何覆盖没有setter的属性?

Jos*_*hua 5 c#

我有一个Item类,它有一个不包含setter的可公开访问的成员NoSetter.该对象显式声明了一个get,它检索一个私有的只读List对象.

class Item
{
    private readonly List<string> emptyString;

    public Item()
    {
        this.emptyString = new List<string>();
    }

    public List<string> NoSetter
    {
        get { return this.emptyString; }
    }
}
Run Code Online (Sandbox Code Playgroud)

创建此对象时,无法将NoSetter设置为列表,编译器会在您尝试时失败.

List<string> goldenString = new List<string>();
goldenString.Add("Nope");
Item item = new Item()
{
    NoSetter = goldenString
    // or NoSetter = new List<string>();
};
Run Code Online (Sandbox Code Playgroud)

但是,如果您内联创建列表,则可以设置NoSetter.

Item item = new Item()
{
    NoSetter = { "But this still works" }
};

// Outputs: "But this still works"
Console.WriteLine(item.NoSetter.First<string>());
Run Code Online (Sandbox Code Playgroud)

我希望NoSetter.Get方法应该返回readonly列表emptyString,而是返回内联的NoSetter对象.是什么导致.net?这是预期的吗?

Cha*_*ger 11

你的第二段代码没有设置新的List<string>,它只是添加了它的值.

Item item = new Item()
{
    NoSetter = { "But this still works" }
};
Run Code Online (Sandbox Code Playgroud)

相当于:

Item item = new Item();
item.NoSetter.Add("But this still works");
Run Code Online (Sandbox Code Playgroud)

{...}应用于集合时的语法称为集合初始值设定项.引用文档(强调我的):

使用集合初始值设定项可以在初始化实现IEnumerable的集合类时指定一个或多个元素初始值设定项.元素初始值设定项可以是简单值,表达式或对象初始值设定项.通过使用集合初始值设定项,您不必在源代码中指定对类的Add方法的多个调用; 编译器添加调用.

  • @CharlesMager`通过使用集合初始化程序,您不必在源代码中指定对类的Add方法的多个调用; 编译器添加调用.https://msdn.microsoft.com/en-us/library/bb384062.aspx (3认同)
  • 这个'NoSetter = {"但这仍然有效"}`看起来不像`添加'的语法,你可能是对的,但有没有引用呢? (2认同)
  • @Andy谢谢,我会补充一下.它是集合初始化器和对象初始化器的组合.文档并不完全涵盖这种特定情况,因此您可能需要转到规范才能完全覆盖它. (2认同)