为什么ReSharper在动态类型上建议一个可能的NullReferenceException ?

本文关键字:一个 NullReferenceException 动态 ReSharper 类型 为什么 | 更新日期: 2023-09-27 18:05:53

如果我编写以下代码,ReSharper警告我可能存在NullReferenceException。然而,我在上面的语句中显式地检查null。是否有一些关于dynamic我不知道的事情(假设它可能由IEnumerable或类似的东西支持)?或者这是ReSharper的一个小故障?还是别的什么?

dynamic user = connection.Query("SELECT ...").FirstOrDefault(); // Dapper Extension
if (user == null)
    return null;
return new User(user.username);
//              ^^^^
// (local variable) dynamic user
//
// Possible 'System.NullReferenceException'

为什么ReSharper在动态类型上建议一个可能的NullReferenceException ?

问题是user == null是一个动态调用;r#不能假设user对象的运行时类型具有正常工作的相等操作符。它很容易有:

public static bool operator ==(Foo x, Foo y) { return false; }
public static bool operator !=(Foo x, Foo y) { return true; }

在这种情况下,user == null将始终返回false,即使user变量是null引用。

尝试将代码更改为:

if (ReferenceEquals(user, null)) return null;
return new User(user.username);

注意:问题只出现当你有"假设实体值可以为空"选项设置为"当实体没有明确的NotNull属性"。

试试这个:

dynamic user = connection.Query("SELECT ...").FirstOrDefault(); // Dapper Extension
if (user != null)
    return new User(user.username);
return null;
相关文章: