gpt4 book ai didi

c# - 这个 C# 字典初始化如何正确?

转载 作者:行者123 更新时间:2023-12-01 23:44:53 24 4
gpt4 key购买 nike

我偶然发现了以下内容,我想知道为什么它没有引发语法错误。

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”的声明值,而忽略其原始值。

  • 为什么这不违法?这是故意的吗?

    最佳答案

    缺少的逗号使一切变得不同。它导致索引器 ["OtherAs"]应用于本词典:

    new Dictionary<string, object>
    {
    ["Name"] = "Solo",
    ["Points"] = 88
    }

    所以基本上你是说:
    new Dictionary<string, object>
    {
    ["Name"] = "Solo",
    ["Points"] = 88
    }["OtherAs"] = new List<Dictionary<string, object>>
    {
    new Dictionary<string, object>
    {
    ["Points"] = 1999
    }
    };

    请注意,这是一个赋值表达式( x = y )。这里 x是带有“名称”和“点”的字典,索引为 "OtherAs"yList<Dictionary<string, object>> .赋值表达式的计算结果为被赋值的值 ( y ),即字典列表。

    然后将整个表达式的结果分配给键“MyA”,这就是“MyA”具有字典列表的原因。

    您可以通过更改字典的类型 x 来确认这是正在发生的事情。 :
    new Dictionary<int, object>
    {
    [1] = "Solo",
    [2] = 88
    }
    // compiler error saying "can't convert string to int"
    // so indeed this indexer is applied to the previous dictionary
    ["OtherAs"] = new List<Dictionary<string, object>>
    {
    new Dictionary<string, object>
    {
    ["Points"] = 1999
    }
    }

    这是您的代码,但已重新格式化并添加了一些括号以说明编译器如何解析它:
    ["MyA"] 
    =
    (
    (
    new Dictionary<string, object>
    {
    ["Name"] = "Solo",
    ["Points"] = 88
    }["OtherAs"]
    )
    =
    (
    new List<Dictionary<string, object>>
    {
    new Dictionary<string, object>
    {
    ["Points"] = 1999
    }
    }
    )
    )

    关于c# - 这个 C# 字典初始化如何正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60024949/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com