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

Nit*_*ant 27 c# linq

什么是默认值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)
{ 

}
Run Code Online (Sandbox Code Playgroud)

如何检查mapping对象是否为空/空
(我在上面的代码中得到编译时错误Operator '!=' cannot be applied to operands of type 'System.Collections.Generic.KeyValuePair<string,int>' and '<null>')

PS:lstMappings属于类型

List<KeyValuePair<string, int>>
Run Code Online (Sandbox Code Playgroud)

Jon*_*Jon 40

任何类型T的默认值都是default(T),因此您可以编写100%的理论精度

if (!mapping.Equals(default(KeyValuePair<string, int>))) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

既然KeyValuePairstruct(即值类型)你无法将它与之比较null.无论如何,将值与==错误进行比较是一种默认方法,因为如果在引用类型上使用它通常会检查引用相等性.


pok*_*oke 24

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
Run Code Online (Sandbox Code Playgroud)

就像我以前使用default(T)默认值初始化对象一样,您也可以使用它来比较您的结果,以确定它是否是默认值:

if (!mapping.Equals(default(KeyValuePair<string, int>)))
{ … }
Run Code Online (Sandbox Code Playgroud)

另一种选择,如果您不想使用默认值,则只需使用First并检查在没有结果值时抛出的异常.


Nik*_*vić 5

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

新键值对(空,0)


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

if (mapping != default(KeyValuePair<string, int>))
{ 
    // Mapping has default value
}
Run Code Online (Sandbox Code Playgroud)

除了KeyValuePair<TKey, TValue>. 对于引用类型default将返回null,否则将返回值类型的默认值。