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>>
答案 0 :(得分:38)
任何类型T的默认值为default(T)
,因此,为了达到100%的理论精确度,您可以编写
if (!mapping.Equals(default(KeyValuePair<string, int>))) {
// ...
}
由于KeyValuePair
是struct
(即值类型),因此您无法将其与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
,否则它将返回值类型的默认值。