Почему nullable KeyValuePair <,> не имеет ключевого свойства? - PullRequest
12 голосов
/ 07 мая 2009

У меня есть следующее:

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 ]

22 голосов
/ 07 мая 2009

Попробуйте вместо этого:

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
}
0 голосов
/ 07 мая 2009

Это связано с тем, что типам, допускающим значение NULL, может быть присвоено нулевое значение или фактическое значение, поэтому вам необходимо вызывать «.value» для всех типов, допускающих значение NULL. «.value» вернет базовое значение или сгенерирует исключение System :: InvalidOperationException.

Вы также можете вызвать ".HasValue" для обнуляемого типа, чтобы убедиться, что фактическому типу присвоено значение.

...