2016-06-21 55 views
0

考虑下面的代码:为什么在使用ConcurrentDictionary时不能将null添加为值?

// 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

@sstan“附加信息:**值**不能为空。” –

+0

@sstan OP就是这么写的。 –

+0

由于字典的全部用途是允许使用键来查找值,因此允许使用空值是没有意义的。如果密钥没有值,那它就不属于字典,就像IRL一样,一个字在定义之前不属于字典。你在字典里找不到未定义的单词,是吗? –

回答

4

代码最终会调用其他GetOrAdd,其中Func作为参数(并且它明确要求不能为空 - “key或valueFactory为null”)。

public TValue GetOrAdd(TKey key,Func<TKey, TValue> valueFactory)... 

修复:明确指定类型:

values.GetOrAdd("test", (Object)null); 

为什么:C#总是试图寻找更具体的匹配和Func<TKey, TValue>Object更具体的 - 这样倍率回升。

+2

如果OP对'TValue'使用了更具体的类型,编译器会通过给他提供“调用不明确”的错误消息来帮助他。 – sstan

+0

谢谢!这很有意义。铸造到对象缓解我的直接问题。 – dmarra

相关问题