C# 为什么nullable KeyValuePair<&燃气轮机;没有密钥属性吗?

C# 为什么nullable KeyValuePair<&燃气轮机;没有密钥属性吗?,c#,.net,generics,.net-2.0,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 contai

我有以下资料:

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'
KeyValuePair?多年电价;
//可以有条件地对其执行某些操作的代码
字符串keyString=myKVP.Key;
//抛出“System.Nullable”
//不包含“键”的定义
我确信这是有原因的,因为我可以看到类型是可空的。是因为我试图在
null
可能导致坏事情发生时访问密钥吗

试试这个:

myKVP.Value.Key;
这是一个精简版的
系统。可为null


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


您还可以在可为null的类型上调用“.HasValue”,以确保为实际类型分配了值。

乍一看有点奇怪,但一旦您了解了它在封面下的工作方式,就完全有意义了。:)所以我猜,nullable有一个值,在这种情况下,值(如果存在)是一个KeyValuePair。所以在本例中,myKVP是一个可空的,它的value属性是KeyValuePair?没错!您以前的注释是100%正确的,这是一个很好的查看方法。如果您使用??操作人员例如:KeyValuePair foo=myNullable??违约;或者,在较新版本的C#,myKVP?.ValueIt不抛出,您会得到一个编译错误。如果您想直接访问该属性,可以将其转换为KeyValuePair。也可以像其他人指出的那样使用myKVP.Value.Key。无论如何都要编译错误,因为在您的示例中,您没有为myKVP分配任何内容,所以它总是空的,编译器会为您捕获它
public struct Nullable<T> where T: struct
{
    public T Value { get; }
}
if (myKVP.HasValue)
{
    // use myKVP.Value in here safely
}