【发布时间】:2017-10-04 04:51:50
【问题描述】:
我今天在进行一些单元测试时发现了一些令人惊讶的行为。如果您将 .NET ConcurrentDictionary<K, V> 实例(尚未使用标准泛型 Dictionary<K, V> 进行测试)转换为 IDictionary,然后使用索引器,它不再引发缺少键异常:
[TestMethod]
public void NotInDictionaryNative()
{
var dict = new ConcurrentDictionary<string, int>();
dict["abc"] = 3;
dict["def"] = 4;
Assert.IsTrue( ( (IDictionary)dict )["q"] == null );
}
这个单元测试通过了!但是,如果你取出演员表,它会失败。这似乎是一种危险的行为:显式实现不应该与常规公共索引器有太大差异,不是吗?
那么,如果我拥有的唯一已知类型是IDictionary,我如何检查是否存在一个密钥,而不是遍历所有密钥并进行比较?
【问题讨论】:
-
这是
IDictionary.Item的预期行为 - 请参阅docs -
我是否遗漏了什么,或者有什么原因你不能使用IDictionary.ContainsKey?
-
@JohnH,不幸的是,
IDictionary上没有定义这样的方法。Contains(object key)方法检查给定值是否存在而不是键。 -
@BrucePierson 您没有使用预期的
IDictionary<T,V>接口,而是使用返回对象的非常旧的IDictionary。这是一个非常不寻常的演员阵容 -
IDictionary<TKey,TValue> 接口确实抛出异常。更旧的(.NET 1.0)IDictionary 没有。只是不要使用
IDictionary
标签: c# .net dictionary exception