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

Ric*_*ick 8 c# resharper dynamic nullreferenceexception

如果我写下面的代码,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'
Run Code Online (Sandbox Code Playgroud)

Ric*_*ing 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; }
Run Code Online (Sandbox Code Playgroud)

在这种情况下,即使变量是引用,user == null也总会返回.falseusernull

尝试将代码更改为:

if (ReferenceEquals(user, null)) return null;
return new User(user.username);
Run Code Online (Sandbox Code Playgroud)

注意:仅当"假定实体值可以为空"选项设置为"当实体没有显式的NotNull属性"时,才会出现此问题.