繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM