Что такое значение по умолчанию `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>>
Ответы
Ответ 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
, в противном случае оно вернет значение по умолчанию значения типа.