请考虑以下代码:
// 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.
文档说明key不能为null,这是有道理的。为什么我得到这个值的例外呢?我不明白这种方法吗?
答案 0 :(得分:4)
代码最终调用以Func
作为参数的另一个GetOrAdd(并且明确要求不为null - &#34; key或valueFactory为null。&#34;)。< / p>
public TValue GetOrAdd(TKey key,Func<TKey, TValue> valueFactory)...
修复:明确指定类型:
values.GetOrAdd("test", (Object)null);
为什么:C#总是试图找到更具体的匹配,Func<TKey, TValue>
比Object
更具体 - 以便选择覆盖。