我有这段代码:
class Program
{
static void Main(string[] args)
{
var a = new Dictionary<string, int>()
{
{ "12", 12 },
{ "13", 13 },
};
}
static object Fifteen()
{
//return new object[] { "15", 15 };
return new {key = "15", value = 15};
}
}
如何编写Fifteen
以便将其添加到初始化程序中?
我想要这个,编译:
var a = new Dictionary<string, int>()
{
{ "12", 12 },
{ "13", 13 },
Fifteen()
};
L.E。编译错误是:error CS7036: There is no argument given that corresponds to the required formal parameter 'value' of 'Dictionary<string, int>.Add(string, int)'
答案 0 :(得分:14)
您需要更改Fifteen
方法,使其返回KeyValuePair
,而不是object
,以便方法的调用方可以访问您所拥有的数据提供(匿名类型只应在它们以与创建它们相同的方法使用时使用):
static KeyValuePair<string, int> Fifteen()
{
return new KeyValuePair<string, int>("15", 15);
}
然后您需要向Dictionary
添加一个扩展方法,以便它有Add
方法接受KeyValuePair
而不是两个参数:
public static void Add<TKey, TValue>(this Dictionary<TKey, TValue> dictionary, KeyValuePair<TKey, TValue> pair)
{
dictionary.Add(pair.Key, pair.Value);
}
之后,您声明的代码会编译并运行得很好。
答案 1 :(得分:2)
那是不可能的。字典初始化程序是语法糖。所以你的代码
var a = new Dictionary<string, int>()
{
{ "12", 12 },
{ "13", 13 },
};
实际上是翻译成:
var tmp = new Dictionary<string, int>();
tmp.Add("12", 12);
tmp.Add("13", 13};
var a = tmp;
因此元素被用作Add
的参数。即使Fifteen()
返回KeyValuePair<string,int>
,编译器仍然会缺少适当的Add
方法。
(但正如Servy所示,您可以提供扩展Add
方法来完成这项工作)