Подтвердить что ты не робот

Как правильно инициализировать объект KeyValuePair?

Я видел в (в том числе) этот вопрос, что люди задаются вопросом, как инициализировать экземпляр KeyValuePair, который, как ожидается, должен выглядеть так.

KeyValuePair<int, int> keyValuePair = new KeyValuePair<int, int>
{ 
  Key = 1,
  Value = 2
};

Это не работает, как будто свойств там нет. Intead, мне нужно использовать конструктор, подобный этому.

KeyValuePair<int, int> keyValuePair = new KeyValuePair<int, int>(1, 2);

По правде говоря, более короткий синтаксис, но меня беспокоит, что я не могу использовать инициализатор. Что я делаю неправильно?

4b9b3361

Ответ 1

Вы не ошибаетесь, вам нужно инициализировать keyValuePair, используя

KeyValuePair<int, int> keyValuePair = new KeyValuePair<int, int>(1, 2);

Причина, по которой вы не можете использовать синтаксис инициализации объекта, т.е. {Key = 1, Value = 2}, состоит в том, что свойства Key и Value не имеют сеттеров только для getters (они только для чтения). Поэтому вы даже не можете делать:

keyValuePair.Value = 1; // not allowed

Ответ 2

KeyValuePair<int, int> является структурой и, к счастью, является неизменной структурой. В частности, это означает, что его свойства читаются только. Таким образом, вы не можете использовать объект intializer для них.

Ответ 3

Хорошо, у вас есть ответы. В качестве альтернативы я предпочитаю шаблон factory, похожий на класс Tuple, для магии ввода типа:)

public static class KeyValuePair
{
    public static KeyValuePair<K, V> Create<K, V>(K key, V value)
    {
        return new KeyValuePair<K, V>(key, value);
    }
}

Таким образом, короткий становится короче:

var keyValuePair = KeyValuePair.Create(1, 2);

Ответ 4

У свойств Key и Value нет сеттеров. Вот почему вы не можете использовать их в инициализаторе. Просто используйте конструктор:), и все будет хорошо.

Ответ 5

Вот пример, который выполняет задание

KeyValuePair<int, int> kvp = new KeyValuePair<int, int>(1, 1);

Ответ 7

Вы не делаете что-то не так. Свойства KeyValuePairs доступны только для чтения. Вы не можете установить их. Кроме того, пустого конструктора по умолчанию нет. Вам нужно использовать предоставленный конструктор.

Ответ 8

Словари имеют компактные инициализаторы:

var imgFormats = new Dictionary<string, ChartImageFormat>()
{
    {".bmp", ChartImageFormat.Bmp}, 
    {".gif", ChartImageFormat.Gif}, 
    {".jpg", ChartImageFormat.Jpeg}, 
    {".jpeg", ChartImageFormat.Jpeg}, 
    {".png", ChartImageFormat.Png}, 
    {".tiff", ChartImageFormat.Tiff}, 
};

В этом случае словарь я использовал для связывания расширений файлов с константами формата изображения объектов диаграммы.

В словаре может быть возвращена одна ключевая пара, как это:

var pair = imgFormats.First(p => p.Key == ".jpg");