如果我编写以下代码,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'
最佳答案
问题是 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 属性时”时才会出现此问题。
关于c# - 为什么 ReSharper 建议在动态类型上可能出现 NullReferenceException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15641790/