gpt4 book ai didi

c# - C# SortedList.Keys.Contains 方法抛出 null 异常是一件好事吗?

转载 作者:行者123 更新时间:2023-11-30 18:45:46 27 4
gpt4 key购买 nike

考虑这段代码(也可用 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);
}
}

问题

输出是

False

ArgumentNullException

在深入了解 SortedList<TKey, TValue> 是如何实现的之后我发现这个调用相当于调用 SortedList<TKey, TValue>.ContainsKey(TKey key) 方法,它有一个 ArgumentNullException记录在案。

另一方面, ICollection<T>.Contains 的文档方法状态:

Returns: true if item is found in the ICollection<T>; otherwise, false.

嗯,null在我的示例中不是第二个集合的一部分,所以我期望 false被退回。一个ArgumentNullException违反了接口(interface),因此是一个错误。

在生产代码中有什么解决方法?考虑到 .Keys ,类型检查将非常难看。 property 返回一个私有(private)泛型嵌套类的实例,我也没有别的想法。另外,类型检查是一种非常讨厌的代码味道。

最佳答案

SortedList 类实现了IDictionary,它指定了SortedListKey, value 性质。由于 IDictionary 实现的预期工作方式(利用哈希码对键进行排序或索引),您不能输入 null 对象作为键,因为 null 没有有效的哈希码。出于这个原因,Contains(...) 方法将在尝试将 null 传递给参数时抛出 ArguementInvalidException,因为它知道null 不是有效的 key 。

如果你想为生产环境“修复”这个问题(我不推荐,因为这真的不是问题),我建议扩展 SortedList 类并覆盖Contains(...) 方法在传递 null 参数时安全返回。

关于c# - C# SortedList<TKey, TValue>.Keys.Contains 方法抛出 null 异常是一件好事吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38132416/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com