【发布时间】:2015-12-22 08:02:25
【问题描述】:
假设,我们有一个非常简单的类:
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" }
};
所以,在 List2 的情况下是可以的,使用“=”我们设置属性。但是在 List1 的情况下,看起来我们设置了属性,但实际上,我们假设在之前的某个地方设置了它,这里我们只设置了值。和数组初始化非常相似:
string[] arr = { "val1", "val2" }
为什么 C# 在这里使用这种令人困惑的语法?
编辑: 我想我用 C# 6.0 语法把很多观众弄糊涂了,但这不是重点。让我们使用旧的好 C# 3.0 和 .net 2.0。正如 Jeff Mercado 建议的那样,让我们也添加更多乐趣,并从一开始就将一些值(“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;
}
}
}
它显示了同样奇怪的语法。最后我有 list { "1", "2", "asdf", "qwer" },这更令人困惑。我可以期待这个。
【问题讨论】:
-
编译? List1 没有公共设置器,因此您应该无法在初始化程序语法中设置它。
-
确实如此。编译器实际上将该语法转换为对
.Add()的调用 -
我同意,这种语法真的很奇怪。从语义上讲,它更像
+=。对于嵌套对象初始化器来说,这完全一样——没有构造函数调用,初始化器只会设置属性。 -
显然,在初始化程序的上下文中,您只是使用集合初始化程序语法,并且您只是向
List1实例添加更多项。您可以验证是否实际保留了初始列表实例。尝试使用非空列表进行初始化或检查引用,您会发现它没有改变。 -
@HenkHolterman 没有解释为什么选择该特定语法。 OP 已经意识到这种行为
标签: c#