为什么可以为空的KeyValuePair<,>没有关键财产?

时间:2009-05-07 15:01:10

标签: c# .net generics .net-2.0

我有以下内容:

KeyValuePair<string, string>? myKVP;
// code that may conditionally do something with it
string keyString = myKVP.Key;  
// throws 'System.Nullable<System.Collections.Generic.KeyValuePair<string,string>>' 
// does not contain a definition for 'Key'

我确信这有一些原因,因为我可以看到该类型可以为空。是因为我在null可能导致不良事件发生时尝试访问密钥吗?

2 个答案:

答案 0 :(得分:22)

请改为尝试:

myKVP.Value.Key;

以下是System.Nullable<T>的精简版:

public struct Nullable<T> where T: struct
{
    public T Value { get; }
}

由于Value属性的类型为T,因此必须使用Value属性来获取正在使用的包装类型实例。

修改:我建议您在使用HasValue之前检查可空类型的Value属性。

if (myKVP.HasValue)
{
    // use myKVP.Value in here safely
}

答案 1 :(得分:0)

这是因为可以为可空类型分配空值或实际值,因此您必须在所有可空类型上调用“.value”。 “.value”将返回基础值或抛出System :: InvalidOperationException。

您也可以在可空类型上调用“.HasValue”以确保为实际类型指定了值。