什么是`KeyValuePair <string,int =“”>`?</string,>的默认值

时间:2014-01-28 11:23:00

标签: c# linq

KeyValuePair<string, int>的默认值是什么?

e.g。我正在运行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对象是否为空/空白
(我在上面的代码Operator '!=' cannot be applied to operands of type 'System.Collections.Generic.KeyValuePair<string,int>' and '<null>'

中遇到编译时错误

PS:lstMappings的类型为

List<KeyValuePair<string, int>>

3 个答案:

答案 0 :(得分:38)

任何类型T的默认值为default(T),因此,为了达到100%的理论精确度,您可以编写

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

由于KeyValuePairstruct(即值类型),因此您无法将其与null进行比较。无论如何,将值与==进行比较是错误的,因为如果在引用类型上使用它通常会检查引用相等性。

答案 1 :(得分:21)

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并检查在没有结果值时抛出的异常。

答案 2 :(得分:4)

KeyValuePair<TKey, TValue>是一个结构,因此是一个值类型,不能是null。结构的默认值是stuct,其默认值为其成员。在这个例子中,它将是:

  

new KeyValuePair(null,0)


这应该回答您的直接问题,但您要尝试进行比较的更优雅的方法是使用default关键字。

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

您可以为KeyValuePair<TKey, TValue>旁边的任何其他类型使用等效代码。对于引用类型default将返回null,否则它将返回值类型的默认值。