为什么我不能在没有为值提供out参数的情况下从ConcurrentDictionary中删除键?

时间:2018-06-09 00:03:15

标签: c# .net-core

请考虑这个简单的代码段:

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上。

1 个答案:

答案 0 :(得分:2)

ConcurrentDictionaryTryRemove因为,如果另一个线程已经删除了该项,它可能会失败。它确实实现了Remove,但作为显式接口实现的一部分。要使用它,您必须将ConcurrentDictionary投射到IDictionary。但这样做可能会打败ConcurrentDictionary的全部内容。

TryRemove的原因是提供一种检索值并以原子方式从集合中删除它的方法。