Почему я не могу добавить ноль в качестве значения при использовании 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
- так что переопределение выбрано.