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

Что такое значение по умолчанию `KeyValuePair <string, int>`?

Что такое значение по умолчанию KeyValuePair<string, int>?

например. Я запускаю запрос LINQ и возвращаю < FirstOrDefault() значение из него

KeyValuePair<string, int> mapping = (from p in lstMappings
    where p.Key.Equals(dc.ColumnName, StringComparison.InvariantCultureIgnoreCase)
    select p).FirstOrDefault();

if (mapping != null)
{ 

}

как проверить, является ли объект mapping null/blank
(Я получаю ошибку времени компиляции в приведенном выше коде Operator '!=' cannot be applied to operands of type 'System.Collections.Generic.KeyValuePair<string,int>' and '<null>')

PS: lstMappings имеет тип

List<KeyValuePair<string, int>>
4b9b3361

Ответ 1

Значение по умолчанию любого типа T default(T), поэтому для 100% теоретической точности вы должны написать

if (!mapping.Equals(default(KeyValuePair<string, int>))) {
    // ...
}

Так как KeyValuePair - это struct (т.е. тип значения), вы не можете сравнить его с null. Независимо от этого, сравнение значений с == неверно как подход по умолчанию, потому что, если он используется в ссылочных типах, он обычно проверяет ссылочное равенство.

Ответ 2

KeyValuePair<T, T> - это структура. Таким образом, это тип значения, не может быть null и будет инициализирован значениями по умолчанию для членов.

Для KeyValuePair<string, int> это будет строка null, а значение int 0.

KeyValuePair<string, int> kvp = default(KeyValuePair<string, int>);
Console.WriteLine(kvp.Key == null); // True
Console.WriteLine(kvp.Value == 0); // True

Точно так же, как я использовал default(T) для инициализации объекта с его значением по умолчанию, вы также можете использовать его для сравнения вашего результата с ним, чтобы узнать, имеет ли значение по умолчанию или нет:

if (!mapping.Equals(default(KeyValuePair<string, int>)))
{ … }

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

Ответ 3

KeyValuePair<TKey, TValue> - это структура, поэтому тип значения и не может быть null. Значением по умолчанию для структуры является значение, заполняемое значениями по умолчанию для его членов. В этом примере это будет:

new KeyValuePair (null, 0)


Это должно ответить на ваш прямой вопрос, но более элегантный способ сделать сравнение, который вы пытаетесь сделать, - это использовать default.

if (mapping != default(KeyValuePair<string, int>))
{ 
    // Mapping has default value
}

Вы можете использовать эквивалентный код для любого другого типа рядом с KeyValuePair<TKey, TValue>. Для ссылочных типов default вернется null, в противном случае оно вернет значение по умолчанию значения типа.