使用ConcurrentDictionary时,为什么不能将null添加为值?

时间:2016-06-21 17:38:02

标签: c# 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.

文档说明key不能为null,这是有道理的。为什么我得到这个值的例外呢?我不明白这种方法吗?

1 个答案:

答案 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更具体 - 以便选择覆盖。