Visual Studio 2022中为何dbUser != null无效,is not null可正常判断?
问题原因分析
你遇到的情况核心原因是**!=运算符被重载且实现错误**,而is not null是C#原生的模式匹配空值检查,不受重载运算符影响。
具体细节:
- 当
databaseUsers.FirstOrDefault(...)找不到匹配项时,返回的是KeyValuePair<string, User>的默认值(因为KeyValuePair是值类型,无法为null),其Value属性对应User类型的默认值——如果User是引用类型,这个值就是null。 - 若你的
User类重载了!=运算符,但重载逻辑未正确处理null场景(比如遗漏null引用检查、比较逻辑错误),就会导致dbUser != null的判断结果与实际情况不符(明明dbUser是null,却返回true)。 - 而
dbUser is not null是C#语言层面的原生空值判断,它直接检查对象引用是否为null,不会调用重载的!=运算符,因此能得到正确结果。
另外,你的代码存在效率问题:FirstOrDefault会遍历整个集合(O(n)复杂度),而SortedDictionary本身支持键的快速查找,推荐改用TryGetValue方法,既高效又能规避默认KeyValuePair的潜在问题:
if (databaseUsers.TryGetValue(user.ObjectGuid, out var dbUser)) { // 找到用户的处理逻辑 } else { // 用户不存在的处理逻辑 }
内容的提问来源于stack exchange,提问作者Imran Yaseen
相关产品推荐
相关产品推荐

