Почему я не могу добавить ноль в качестве значения при использовании ConcurrentDictionary?

Рассмотрим следующий код:

// holds the actual values
        private volatile ConcurrentDictionary<string, Object> values;

        public object this[string key] {
            get {     
                // exception is thrown on this line          
                return values.GetOrAdd(key, null);                
            }
            set {
                values.AddOrUpdate(key, value, (k, v) => value);                
            }
        }

Что я хочу сделать, это просто создать запись в словаре, если она еще не существует; оно не должно иметь значения, пока что-то явно не установит его. Я получаю это исключение, хотя:

An unhandled exception of type 'System.ArgumentNullException' occurred in mscorlib.dll

Additional information: Value cannot be null.

В документации говорится, что ключ не может быть нулевым, что имеет смысл. почему я получаю это исключение для значения, хотя? Я не понимаю этот метод?

1 ответ

Решение

Код заканчивается вызовом другого GetOrAdd, который принимает Func в качестве аргумента (и явно требуется, чтобы он не был нулевым - "key или valueFactory is null.").

public TValue GetOrAdd(TKey key,Func<TKey, TValue> valueFactory)...

Исправлено: указать тип явно:

 values.GetOrAdd("test", (Object)null);

Почему: C# всегда пытается найти более конкретное соответствие и Func<TKey, TValue> более конкретно, чем Object - так что переопределение выбрано.

Другие вопросы по тегам