Почему вы не можете использовать null в качестве ключа для словаря <bool ?, string>? - PullRequest
63 голосов
/ 01 февраля 2010

Очевидно, вы не можете использовать null для ключа, даже если ваш ключ имеет тип NULL.

Этот код:

var nullableBoolLabels = new System.Collections.Generic.Dictionary<bool?, string>
{
    { true, "Yes" },
    { false, "No" },
    { null, "(n/a)" }
};

... приводит к этому исключению:

Значение не может быть нулевым. Имя параметра: ключ

Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

[ArgumentNullException: Value cannot be null. Parameter name: key] System.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument) +44 System.Collections.Generic.Dictionary'2.Insert(TKey key, TValue value, Boolean add) +40
System.Collections.Generic.Dictionary'2.Add(TKey key, TValue value) +13

Почему .NET Framework допускает тип ключа, допускающий значение NULL, но не допускает нулевое значение?

Ответы [ 11 ]

0 голосов
/ 01 февраля 2010

Ключи словаря не могут быть нулевыми в .NET, независимо от типа ключа (обнуляемый или нет).

Из MSDN: пока объект используется в качестве ключа в словаре(Of <(TKey, TValue>)>), он не должен изменяться каким-либо образом, который влияет на его хэш-значение.Каждый ключ в словаре <(Of <(TKey, TValue>)>) должен быть уникальным в соответствии со средством сравнения равенства словаря.Ключ не может быть пустой ссылкой (Nothing в Visual Basic), но значение может быть, если тип значения TValue является ссылочным типом.(http://msdn.microsoft.com/en-us/library/xfhwa508.aspx)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...