ConcurrentDictionary Remove()无法访问

时间:2018-07-24 10:56:02

标签: c#

所以我有一个用.NET 4.7编译的最小示例:

class Program
{
    static void Main(string[] args)
    {
        IDictionary<int, string> dic = new ConcurrentDictionary<int, string>();
        ConcurrentDictionary<int, string> sameDic = (ConcurrentDictionary<int, string>) dic;

        dic.Add(1, "Hold");
        dic.Add(2, "position");

        dic.Remove(1); // OK 
        sameDic.Remove(2); // Not even compiling !! 
    }
}
  • 然后致电dic.Remove(1)是否安全?
  • 知道编译器不接受以下代码,我该如何重现相同的行为?

代码:

public interface IFoo
{
    void B();
}

public class Bar : IFoo
{
    private void B() // Not allowed 
    {
    }
}

2 个答案:

答案 0 :(得分:4)

您似乎正在寻找explicit interface implementation 1 。您可以编写:

public interface IFoo
{
    void B();
}

public class Bar : IFoo
{
    void IFoo.B()
    {
    }
}

现在{{1}上的B仅在以Bar的身份访问Bar时可访问


1 而且,实际上,在IFoo文档中,它是where you'll find IDictionary.Remove listed

答案 1 :(得分:1)

接口方法IDictionary<TKey, TValue>.Remove()ConcurrentDictionary<TKey, TValue>中是implemented explicitly,需要接口引用才能调用该方法。

.NET Framework团队决定这样做的原因在文档中尚不清楚,但是是的,可以安全地调用它,因为它在内部仍然调用TryRemove()

  

如何重现相同的行为

请参见Explicit Interface Implementation (C# Programming Guide)