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