ConcurrentDictionary转换为IDictionary,丢失键的索引器不再抛出异常

时间:2017-05-05 16:11:11

标签: c# .net dictionary exception

我在进行一些单元测试时发现了一些令人惊讶的行为。如果您将.NET ConcurrentDictionary<K, V>实例(未使用标准通用Dictionary<K, V>进行测试)转换为IDictionary,然后使用索引器,则不再引发缺少的键异常:< / p>

[TestMethod]
public void NotInDictionaryNative()
{
    var dict = new ConcurrentDictionary<string, int>();
    dict["abc"] = 3;
    dict["def"] = 4;

    Assert.IsTrue( ( (IDictionary)dict )["q"] == null );
}

本单元测试通过!但是如果你拿出演员阵容,那就失败了。这似乎是一种危险的行为:明确的实现不应该与普通的公共索引器有很大差异,是不是应该这样做?

所以,如果我所拥有的唯一已知类型是IDictionary,我如何检查是否存在没有循环遍历所有键并进行比较的键?

1 个答案:

答案 0 :(得分:1)

接口是合同,这些合同可以包括成员将要或不会抛出的异常。 IDictionary.Item合同并没有说实施者会抛出一个关键的异常,所以实施者不应该抛出它。