字典中的无效键

16
为什么字典在使用无效的键索引集合时不会返回null呢?
5个回答

29

由于通用字典可以包含值类型的实例,而对于值类型来说null是无效的。例如:

var dict = new Dictionary<string, DateTime>();
DateTime date = dict["foo"]; // What should happen here?  date cannot be null!
你应该使用字典的TryGetValue方法:
var dict = new Dictionary<string, DateTime>();
DateTime date;

if (dict.TryGetValue("foo", out date)) {
    // Key was present; date is set to the value in the dictionary.
} else {
    // Key was not present; date is set to its default value.
}

此外,一个存储引用类型的字典仍会存储 null 值。而且你的代码可能会认为 "value is null" 与 "key does not exist" 是不同的。


这并没有真正解决设计决策的原因; 他们可以很容易地将其返回default(DateTime)而不是null。 - Extragorey
@Extragorey 是的,特别是最后一句话:无论“未找到”值是什么,您可能需要将该值存储为有意义的值。如果获取一个未找到的键返回 default(DateTime),那么您无法区分“值为default(DateTime)”和“键不存在”,至少需要额外调用 ContainsKey()(这将不必要地使操作成本翻倍)。对于包含引用类型作为值的字典,也许 null 是一个有意义的状态,而不是“键不存在”。 - cdhowie
谢谢,那个解释更有意义。 - Extragorey

5

微软决定这样做 =)
进行内联检查以避免这种情况发生。

object myvalue = dict.ContainsKey(mykey) ? dict[mykey] : null;


4

实际原因:因为字典可以存储null值。在您的情况下,您无法通过异常区分这种情况。



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接