C# 为什么我需要从ConcurrentDictionary转换为IDictionary才能使用Add()?

C# 为什么我需要从ConcurrentDictionary转换为IDictionary才能使用Add()?,c#,concurrency,concurrentdictionary,C#,Concurrency,Concurrentdictionary,如果我有一个ConcurrentDictionary并想使用Add()函数,我需要转换到IDictionary: var cd = new ConcurrentDictionary<int, int>(); cd.Add(1, 1); // Compile error: does not contain a definition for 'Add' IDictionary<int, int> id = cd; id.Add(1, 1); // Works var c

如果我有一个
ConcurrentDictionary
并想使用
Add()
函数,我需要转换到
IDictionary

var cd = new ConcurrentDictionary<int, int>();
cd.Add(1, 1);  // Compile error: does not contain a definition for 'Add'
IDictionary<int, int> id = cd;
id.Add(1, 1);  // Works
var cd=new concurrentdirectionary();
cd.添加(1,1);//编译错误:不包含“添加”的定义
id字典id=cd;
id.Add(1,1);//作品
问题告诉我这是因为
ConcurrentDictionary
使用私有方法显式实现了
IDictionary

我的问题:为什么
ConcurrentDictionary
是这样实现的?隐藏已实现接口的使用有什么好处

我的问题是:为什么ConcurrentDictionary是这样实现的

我相信这是为了鼓励您考虑并发的含义——多个线程可能同时编写相同的密钥。因此,添加现有密钥不太可能是编程错误,应该仔细考虑

  • 如果要无条件覆盖,请使用索引器
  • 如果要添加或更新,更新可以使用现有值,请使用
    AddOrUpdate
  • 如果希望尽可能添加,但不覆盖任何现有值,请使用
    TryAdd

如果您发现自己经常需要现有的
Add
行为,您可以编写自己的扩展方法。

我认为您可以尝试使用ConcurrentDictionary中的TryAdd()或AddOrUpdate()方法,如图所示


这可能也是因为
IDictionary.Add
被简单地实现为
if(!TryAdd(…)throw,它非常简单,即使在对并发字典有意义的情况下,调用方仍然可以选择执行完全相同的操作,而不必通过
IDictionary
访问字典。