收集初始化器的奇怪语法

Ale*_*nko 5 c#

假设,我们有一个非常简单的类:

class ObjectList {
    public List<string> List1 { get; } = new List<string>();
    public List<string> List2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我们想要创建这个类的实例:

ObjectList objectList = new ObjectList {
    List1 = { "asdf", "qwer" },
    List2 = new List<string> { "zxcv", "1234" }
};
Run Code Online (Sandbox Code Playgroud)

所以,在List2的情况下,没关系,使用"="我们设置属性.但是在List1的情况下,它看起来像我们设置属性,但实际上,我们假设在之前设置它,在这里我们只设置值.它与数组初始化非常相似:

string[] arr = { "val1", "val2" }
Run Code Online (Sandbox Code Playgroud)

为什么C#在这里使用这种令人困惑的语法?

编辑:我想我用C#6.0语法让很多观众感到困惑,但这不是重点.让我们使用旧的C#3.0和.net 2.0.并且让我们添加更多乐趣,并从头开始添加一些值("1"和"2")到列表中,正如Jeff Mercado建议的那样:

class Program {
    static void Main(string[] args) {
        ObjectList objectList = new ObjectList {
            List1 = { "asdf", "qwer" },
        };
    }
}
class ObjectList {
    List<string> _List1 = new List<string>() { "1", "2" };
    public List<string> List1 {
        get {
            return _List1;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它显示了相同的奇怪语法.最后我列出了{"1","2","asdf","qwer"},这更令人困惑.我可以期待这一点.

Car*_*ñoz 2

Eric Lippert在他的回答Why is an Add method required for { }初始化?

集合初始值设定项的典型使用场景所激发的设计目标是使现有集合类型的初始化可以在表达式语法中实现,以便集合初始值设定项可以嵌入到查询推导式中或转换为表达式树。

其他所有场景的优先级都较低;该功能之所以存在,是因为它有助于 LINQ 工作

因此,即使这种语法在创建只读集合时更有意义,但无论如何还是添加了它,以便他们可以按时交付 LINQ。

  • @AlexButenko:因为您希望能够区分“我正在添加到现有列表”和“我希望使用这些项目创建一个新列表”的情况。我同意这是一个微妙且有些令人困惑的差异,但语言需要有一种方法来表达这两个概念。 (2认同)