【发布时间】:2017-06-16 14:07:02
【问题描述】:
我有以下 C# 代码,它使用 int 键和 List<string> 值初始化一个新字典:
var dictionary =
new Dictionary<int, List<string>>
{
[1] = new List<string> { "str1", "str2", "str3" },
[2] = new List<string> { "str4", "str5", "str6" }
};
如果我将此 sn-p 生成的可执行文件反编译回 C#,则相应的部分如下所示:
Dictionary<int, List<string>> expr_06 = new Dictionary<int, List<string>>();
expr_06[1] = new List<string>
{
"str1",
"str2",
"str3"
};
expr_06[2] = new List<string>
{
"str4",
"str5",
"str6"
};
一切看起来都很正常,在这里工作正常。
但是当我有以下代码时:
var dictionary2 =
new Dictionary<int, List<string>>
{
[1] = { "str1", "str2", "str3" },
[2] = { "str4", "str5", "str6" }
};
这再次看起来像正常代码并成功编译,但在运行时我得到以下异常:
System.Collections.Generic.KeyNotFoundException: '给定的键不在字典中。'
当我查看第二个示例的反编译代码时,我发现它与第一个不同:
Dictionary<int, List<string>> expr_6E = new Dictionary<int, List<string>>();
expr_6E[1].Add("str1");
expr_6E[1].Add("str2");
expr_6E[1].Add("str3");
expr_6E[2].Add("str4");
expr_6E[2].Add("str5");
expr_6E[2].Add("str6");
当然这也解释了例外情况。
所以现在我的问题是:
这是预期行为吗?是否记录在某处?
-
为什么上面的语法允许,下面的语法不允许?
List<string> list = { "test" }; -
那么为什么不允许下面的语法呢?
var dict = new Dictionary<int, string[]> { [1] = { "test1", "test2", "test3" }, [2] = { "test4", "test5", "test6" } };
类似但不同的问题:
【问题讨论】:
-
使用
new List<string>,您将一个新对象分配给一个键。如果没有new,该语法用于初始化现有的集合对象。但是一个都没有。我很惊讶它可以编译。 -
@EdPlunkett 编译器无法知道您正在初始化一个不存在的值。
-
@Servy 好的,
{ [1] = new List<string>(), [1] = { "foo", "bar", "baz" } }很奇怪,但它可以工作——如果TValue是List<String>。但事实证明,第二种情况无法编译,因为TValue是string[],它没有Add()方法;我没有注意到第二个是一个数组。
标签: c# dictionary initialization c#-6.0