Вы можете избежать использования утратившего создать специальный класс одноплодного значения, которое делает то же самое. Например:
public sealed class Nothing
{
public static readonly Nothing Value = new Nothing();
private Nothing() {}
}
Dictionary<object, string> dict = new Dictionary<object, string>();
dict.add(Nothing.Value, "Nothing");
dict.add(1, "One");
Этот подход не будет работать, если вы намерены сделать свою коллекцию более сильно типизированных - скажем, например, вы хотите ключ, чтобы быть строкой. Поскольку строка запечатана, вы не можете наследовать ее, чтобы создать замену «специального значения» для null. Ваши альтернативы становятся немного сложнее. Вы можете:
- Создайте специальное значение постоянной для представления «пустого»/«нулевого» случая. Вид хаки и определенно путь к путанице. Это может быть жизнеспособным подходом, если словарь полностью закрыт для какого-либо класса реализации, и вы можете написать некоторые методы утилиты Encode/Decode, чтобы не распространять знания о том, как вы переводите ключи по всему месту.
- Создайте собственную реализацию IDictionary, которая внутренне делегирует словарь <> экземпляр - за исключением случая null. Это нарушает документально подтвержденные ожидания для интерфейса IDictionary <>, который говорит, что пустые ключи должны генерировать исключение. Но вы можете уйти от него, если это единственный способ решить вашу реальную проблему. Это работает только в том случае, если вы владеете и создаете экземпляр словаря.
- Найдите способ решить вашу проблему без сохранения «нулевого» ключа в словаре. Например, рассмотрите вопрос о том, чтобы не заполнять нулевой ключ в словаре и иметь некоторую специальную логику случая для решения этой проблемы. Ключи должны быть хешируемыми и сопоставимыми с работой с основной реализацией, поэтому нуль запрещается в обычном режиме.
Как в стороне, действительно ли вам нужен ключ для слова, который должен быть object
? Это может привести к незначительным ошибкам из-за использования ссылочного равенства, в котором вы могли бы предполагать, что Equals() оценивается как основа для сравнения.
Просто интересно, где вам это нужно? Спасибо –