Dictionary.Add参数不匹配错误:嵌套字典初始化问题咨询
解决嵌套Dictionary初始化的参数错误问题
嘿,这个问题我太熟了!你遇到的错误根源是内层Dictionary<string, string>的初始化语法不对——编译器把你写的{"E","error"}当成了两个独立的字符串参数,而Dictionary<string, string>.Add()方法需要的是一个键值对组合,不是分开的两个字符串。
错误原因拆解
当你写new Dictionary<string, string>() {"E","error"}时,编译器会尝试匹配Dictionary的初始化逻辑:它会把每个逗号分隔的元素当成调用Add方法的参数。但Add(string key, string value)需要两个参数,你现在相当于给Add传了两次单个字符串参数,自然会抛出“缺少必需形参‘value’”的错误。
正确的初始化写法
下面给你三种可行的解决方案,按简洁程度排序:
1. 推荐:使用C# 6+的键值对初始化语法
这种方式最直观简洁,直接用[键] = 值的形式定义内层字典的键值对:
Dictionary<string, Dictionary<string, string>> PredictiveTable = new Dictionary<string, Dictionary<string, string>>() { {"+", new Dictionary<string, string>() { ["E"] = "error" } }, {"*", new Dictionary<string, string>() { ["E"] = "error" } }, {"i", new Dictionary<string, string>() { ["E"] = "E->TK" } }, {"(", new Dictionary<string, string>() { ["E"] = "E->TK" } }, // 继续添加其他项即可 };
2. 显式使用KeyValuePair
如果你的项目使用的是C# 5及更早版本,不支持上面的语法,可以显式创建KeyValuePair对象:
Dictionary<string, Dictionary<string, string>> PredictiveTable = new Dictionary<string, Dictionary<string, string>>() { {"+", new Dictionary<string, string>() { new KeyValuePair<string, string>("E", "error") } }, {"*", new Dictionary<string, string>() { new KeyValuePair<string, string>("E", "error") } }, {"i", new Dictionary<string, string>() { new KeyValuePair<string, string>("E", "E->TK") } }, {"(", new Dictionary<string, string>() { new KeyValuePair<string, string>("E", "E->TK") } }, // 其他项 };
3. 先初始化内层字典再赋值
如果你觉得嵌套初始化太绕,也可以先单独创建每个内层字典,再添加到外层字典中:
// 先创建每个内层字典 var plusDict = new Dictionary<string, string>(); plusDict.Add("E", "error"); var starDict = new Dictionary<string, string>(); starDict.Add("E", "error"); var iDict = new Dictionary<string, string>(); iDict.Add("E", "E->TK"); var leftParenDict = new Dictionary<string, string>(); leftParenDict.Add("E", "E->TK"); // 组装外层字典 Dictionary<string, Dictionary<string, string>> PredictiveTable = new Dictionary<string, Dictionary<string, string>>() { {"+", plusDict}, {"*", starDict}, {"i", iDict}, {"(", leftParenDict}, // 其他项 };
额外提示
如果你的预测表有大量重复的内层字典(比如多个键对应相同的{"E", "error"}),可以把重复的字典抽成一个共享变量,避免重复创建对象,提升效率。
内容的提问来源于stack exchange,提问作者Bowen Peng
相关产品推荐
相关产品推荐

