我偶然发现以下内容,并且想知道为什么它没有引发语法错误。
var dict = new Dictionary<string, object>
{
["Id"] = Guid.NewGuid(),
["Tribes"] = new List<int> { 4, 5 },
["MyA"] = new Dictionary<string, object>
{
["Name"] = "Solo",
["Points"] = 88
}
["OtherAs"] = new List<Dictionary<string, object>>
{
new Dictionary<string, object>
{
["Points"] = 1999
}
}
};
请注意,“ MyA”和“ OtherAs”之间缺少“,”。
这是混乱发生的地方:
- 代码会编译。
- 最终的词典“ dict”仅包含三个元素:“ Id”,“ Tribes”和“ MyA”。
- 除“ MyA”以外的所有值均正确,
- “ MyA”采用“ OtherAs”的声明值,而其原始值将被忽略。
为什么这不是非法的?这是设计使然吗?
链接太长,无法粘贴第一个评论。确实这很奇怪。sharplab.io/...
—
pinkfloydx33
是的,我已经用LinqPad对其进行了测试,并得到了相同的结果。不知道这是怎么回事。让我们看看是否有一些C#专家可以在这里阐明一些信息。
—
史蒂夫
如果将第一个字典更改为
—
pinkfloydx33
<string, string> and modify Points to
“ 88”,则会收到编译器错误“无法将类型'System.Collections.Generic.List <System.Collections.Generic.Dictionary <string,object >>'隐式转换为'string'”这实际上帮助我找出了答案!
@OlegI我不认为它是编译器错误。答案中已经提供了许多很好的解释。但如果您尝试
—
MKR
var test = new Dictionary<string, object> { ["Name"] = "Solo", ["Points"] = 88 }["OtherAs"] = new List<Dictionary<string, object>> { new Dictionary<string, object> { ["Points"] = 1999 } };
将进一步解释。
OtherAs
的键添加的。(Name = Solo,Points = 88 plus OtherAs = List <Dictionary <string,object >>),但是它永远不会分配它。取而代之的是,它放置字典列表,现在仅在插槽中包含单个Points = 1999条目,从而覆盖了该位置所认为的内容。MyA
MyA