KeyCollection作为IEnumerable时LINQ Contains方法行为不一致问题咨询
IEnumerable.Contains(null)的行为差异与解决方案疑问
问题现象
以下代码执行后会输出false:
IEnumerable<string> x = new List<string>(); Console.WriteLine(x.Contains(null));
但换成Dictionary的Keys集合作为IEnumerable<string>时,调用Contains(null)会直接抛出ArgumentNullException:
IEnumerable<string> x = new Dictionary<string, string>().Keys; Console.WriteLine(x.Contains(null));
背景说明
我知道Dictionary.ContainsKey传入null时会抛出异常,推测Dictionary.KeyCollection的Contains方法行为就是源于此。但ContainsKey调用时会有编译警告(绿色波浪线),而通过IEnumerable接口调用时,编译阶段不会报错,只会导致程序运行时崩溃。
现有解决方案思路
由于调用代码无法提前知晓传入的IEnumerable的底层实现类型,我想到两种处理方案:
- 完全避免对可空类型使用
IEnumerable.Contains()方法; - 将
KeyCollection这类特殊集合先转换为List,再以IEnumerable的方式处理。
想请教:这两种方案是否合理,有没有遗漏的其他关键要点?
内容的提问来源于stack exchange,提问作者chanban
相关产品推荐
相关产品推荐

