![](/img/trans.png)
[英]How can I tell `ConcurrentDictionary.GetOrAdd` to not add a value?
[英]Why can I not add null as a value when using 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.
文档指出密钥不能为null,这是有道理的。 为什么我会得到这个例外以获取价值? 我不明白这种方法吗?
代码最终调用另一个以Func
为参数的GetOrAdd (并且明确要求它不能为null-“ key或valueFactory为null。”)。
public TValue GetOrAdd(TKey key,Func<TKey, TValue> valueFactory)...
修复:明确指定类型:
values.GetOrAdd("test", (Object)null);
原因:C#总是尝试查找更具体的匹配项,而Func<TKey, TValue>
比Object
更具体-以便选择覆盖。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.