【发布时间】:2016-06-30 20:12:44
【问题描述】:
考虑这段代码(也可以使用in Ideone):
using System;
using System.Collections.Generic;
class Program {
static void Main() {
Console.WriteLine(HasItem(new List<string>(), null));
try {
Console.WriteLine(HasItem(new SortedList<string, int>().Keys, null));
} catch (ArgumentNullException) {
Console.WriteLine("ArgumentNullException");
}
}
public static bool HasItem(ICollection<string> collection, string item) {
return collection.Contains(item);
}
}
问题
输出是
错误
ArgumentNullException
在深入了解SortedList<TKey, TValue> 的工作原理后,我发现此调用等效于调用SortedList<TKey, TValue>.ContainsKey(TKey key) 方法,该方法记录了ArgumentNullException。
另一方面,ICollection<T>.Contains 方法的文档指出:
如果在
ICollection<T>中找到项目,则返回:true;否则,false。
好吧,null 在我的示例中不是第二个集合的一部分,所以我希望返回 false。 ArgumentNullException 违反了接口,因此是一个错误。
生产代码中的解决方法是什么?鉴于.Keys 属性返回私有通用嵌套类的实例,类型检查将非常难看,而我没有任何其他想法。另外,类型检查是一种非常讨厌的代码气味。
【问题讨论】:
-
我想有你的问题:-)
-
> 生产代码中的解决方法是什么?也有点讨厌,但是捕获异常并返回
false。 -
@Jay 谢谢你,是的,这是一种可能,但它太宽泛了,不幸的是——我只想处理
SortedList的情况 -
catch (ArgumentNullException) { return false; }?我知道,它也很丑。 -
我实际上会说包含实现是错误的,因为它应该查看值而不是键。话虽如此 - 它就是这样,它不会改变所以代码围绕它
标签: c# specifications sortedlist