请考虑这个简单的代码段:
using System.Collections.Concurrent;
using System.Collections.Generic;
namespace WTF
{
class Program
{
static void Main(string[] args)
{
ConcurrentDictionary<int ,int> dict = new ConcurrentDictionary<int, int>();
dict.Remove(5);
}
}
}
我会双重检查文档:ConcurrentDictionary
is supposed to implement the Remove(TKey)
overload,而不仅仅是Remove(TKey, out TValue)
重载。所以,我相信,这段代码应该没问题。
然而,显然,编译器不同意:
1>------ Build started: Project: WTF, Configuration: Debug Any CPU ------
1>Program.cs(12,18,12,24): error CS7036: There is no argument given that corresponds to the required formal parameter 'value' of 'CollectionExtensions.Remove<TKey, TValue>(IDictionary<TKey, TValue>, TKey, out TValue)'
1>Done building project "WTF.csproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
我错过了什么?我做错了什么?或者我误读了文档?
如果这很重要,据我所知,我在.NET Core 2.1上。
答案 0 :(得分:2)
ConcurrentDictionary
有TryRemove
因为,如果另一个线程已经删除了该项,它可能会失败。它确实实现了Remove
,但作为显式接口实现的一部分。要使用它,您必须将ConcurrentDictionary
投射到IDictionary
。但这样做可能会打败ConcurrentDictionary
的全部内容。
TryRemove
的原因是提供一种检索值并以原子方式从集合中删除它的方法。