假设,我们有一个非常简单的类:集合初始化的怪异语法
class ObjectList {
public List<string> List1 { get; } = new List<string>();
public List<string> List2 { get; set; }
}
,我们想使这个类的一个实例:
ObjectList objectList = new ObjectList {
List1 = { "asdf", "qwer" },
List2 = new List<string> { "zxcv", "1234" }
};
所以,在列表2的情况下,好吧,使用“=”我们设置属性。但是,在List1的情况下,它看起来像我们设置属性,但实际上,我们假设在之前的某个位置设置它,并且在这里我们只设置值。它和数组初始化非常相似:
string[] arr = { "val1", "val2" }
为什么C#在这里使用这种混淆语法?
编辑: 我想我很困惑与C#6.0语法的观众,但它不是重点。让我们使用旧的C#3.0和.net 2.0。并允许增添更多的乐趣也该增加一些值(“1”和“2”)的列表,从开始,杰夫梅尔卡多推荐:
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;
}
}
}
它显示了同样怪异的语法。最后,我列出了名单{“1”,“2”,“asdf”,“qwer”},这更加令人困惑。我可以期待这一点。
编译? List1没有公共setter,所以你不应该在initializer语法中设置它。 –
它的确如此。编译器实际上将该语法转换为调用'.Add()' –
我同意,这种语法真的很奇怪。在语义上,它更像'+ ='。嵌套对象初始化器完全一样 - 没有构造函数调用,初始化器只设置属性。 –