8

如果我编写以下代码,ReSharper 会警告我可能的NullReferenceException. 但是,我null在上面的语句中明确检查。有什么dynamic我不知道的(是否假设它可能得到 aIEnumerable或类似的支持)?或者这是 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'
4

2 回答 2

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也会始终返回。falseusernull

尝试将代码更改为:

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

注意:仅当您将“假设实体值可以为空”选项设置为“当实体没有显式 NotNull 属性时”时才会出现问题。

于 2013-07-04T19:25:07.260 回答
1

尝试这个 :

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

return null;
于 2013-07-04T17:32:55.873 回答