Тип инициализатора словаря - PullRequest
0 голосов
/ 07 мая 2018

У меня есть этот код:

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 голосов
/ 07 мая 2018

Вы захотите изменить свой метод 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);
}

После чего указанный вами код компилируется и работает просто отлично.

0 голосов
/ 07 мая 2018

Это невозможно. Инициализатор словаря - синтаксический сахар. Так твой код

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, который делает свое дело)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...