在这些初始化语句编译的前提下。
假设这是替换现有成员的一些不寻常的符号表示法。现在,初始化会抛出一个 StackOverflowException 异常。
所以我的问题是,为什么这个表达式甚至能够通过编译?它应该做什么?我觉得我一定漏掉了什么非常明显的东西。
List<int> l = new List<int> { 1, 2, 3 };
Dictionary<int, int> d = new Dictionary<int, int> { [1] = 11, [2] = 22 };
Foo f = new Foo { Bar = new List<int>() };
而这将不会
List<int> l = { 1, 2, 3 };
Dictionary<int, int> d = { [1] = 11, [2] = 22 };
Foo f = { Bar = new List<int>() };
我有一个关于嵌套初始化的问题。给定以下类:
public class Foo {
public List<int> Bar { get; set; } = new List<int>();
public Dictionary<int, Foo> Baz { get; set; } = new Dictionary<int, Foo>();
}
我意外地发现,您实际上可以这样做:
Foo f = new Foo {
Bar = { 1, 2, 3 },
Baz = {
[1] = {
Bar = { 4, 5, 6 }
}
}
};
虽然它编译通过,但会抛出一个KeyNotFoundException
异常。因此,我将属性更改为
public List<int> Bar { get; set; } = new List<int> { 4, 5, 6 };
public Dictionary<int, Foo> Baz { get; set; }
= new Dictionary<int, Foo> { [1] = new Foo { Bar = new List<int>() { 1, 2, 3 } } };
假设这是替换现有成员的一些不寻常的符号表示法。现在,初始化会抛出一个 StackOverflowException 异常。
所以我的问题是,为什么这个表达式甚至能够通过编译?它应该做什么?我觉得我一定漏掉了什么非常明显的东西。
Foo
将会创建一个Dictionary
并创建一个要添加到其中的Foo
,这反过来又会创建一个带有Foo
的Dictionary
,以此类推。 - juharrBaz = {{1,new Foo { Bar = {4,5,6}}}};
以使其正常工作,因为该符号使用字典的Add(Tkey,TValue)
,在这种情况下,如果没有new Foo
,它将无法编译。 - juharr