字典初始值设定项的类型

时间:2018-05-07 13:47:58

标签: c# dictionary

我有这段代码:

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)'

2 个答案:

答案 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方法来完成这项工作)