如果我编写以下代码,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'
答案 0 :(得分:5)
问题是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属性”时才会出现问题。
答案 1 :(得分:1)
试试这个:
dynamic user = connection.Query("SELECT ...").FirstOrDefault(); // Dapper Extension
if (user != null)
return new User(user.username);
return null;