编程语言
首页 > 编程语言> > c# – 为什么必须显式声明嵌套类型?

c# – 为什么必须显式声明嵌套类型?

作者:互联网

我认为这是我第一次使用新的C#6字典初始化功能,我需要一个如下所示的嵌套结构:

        var map = new Dictionary<string, Dictionary<string, object>>()
        {
            ["WNodeScramblingResetZone_Unlock"] = 
            {
                ["updater"] ="pinco",
                ["rdlev"] = 55
            },
            ["WNodeScramblingResetZone_NewPwd"] = 
            {
                ["updater"] ="pallo",
                ["wrlev"] = 75,
                ["is_online"] = true
            }
        };

这种语法似乎很好:没有编译错误.但是,当程序启动时,我在输出窗口中看到一些“KeyNotFoundException”错误,并且应用程序不起作用.

顺便说一句,如果我显式声明嵌套类型实例化,一切运行正常.

        var map = new Dictionary<string, Dictionary<string, object>>()
        {
            ["WNodeScramblingResetZone_Unlock"] = new Dictionary<string, object>()
            {
                ["updater"] ="pinco",
                ["rdlev"] = 55
            },
            ["WNodeScramblingResetZone_NewPwd"] = new Dictionary<string, object>()
            {
                ["updater"] ="pallo",
                ["wrlev"] = 75,
                ["is_online"] = true
            }
        };

这是一个限制,一个错误,还是有一个具体的理由来定义它?

解决方法:

当你编写这样的代码时:

var map = new Dictionary<string, Dictionary<string, object>>()
{
    ["WNodeScramblingResetZone_Unlock"] = 
    {
        ["updater"] ="pinco"
    }
};

它被编译成相当于:

var map = new Dictionary<string, Dictionary<string, object>>()
map["WNodeScramblingResetZone_Unlock"]["updater"] = "pinco";

它不会创建您未明确指定的任何实例.

这是一些可以工作的代码(这就是为什么它是允许的),对于一些类似字典的类,它返回不存在的键的空集合,但确实会导致Dictionary的KeyNotFoundException.

另一方面,这段代码:

var map = new Dictionary<string, Dictionary<string, object>>()
{
    ["WNodeScramblingResetZone_Unlock"] = new Dictionary<string, object>()
    {
        ["updater"] ="pinco"
    }
};

编译为:

var map = new Dictionary<string, Dictionary<string, object>>();
var tmp = new Dictionary<string, object>();
tmp["updater"] = "pinco";
map["WNodeScramblingResetZone_Unlock"] = tmp;

正如您所看到的,这将使用新实例(而不是之前版本中的getter)调用map [“WNodeScramblingResetZone_Unlock”] setter,这就是它工作的原因.

标签:c,dictionary,initialization,c-6-0
来源: https://codeday.me/bug/20190623/1268715.html