c# - 为什么 ReSharper 建议在动态类型上可能出现 NullReferenceException?

标签 c# dynamic resharper 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'

最佳答案

问题是 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/

相关文章:

c# - 如何使用 C# 和 WebClient 类检查服务器上是否存在文件

c# - 动态设置 C# 匿名类型的属性名称

JavaScript:如何获取动态创建的元素的宽度?

visual-studio - resharper + VS Black 主题使 Note : and TODO: Blue and hard to read

c# - 如何在 Parallel.ForEach 上执行函数?

visual-studio - 将 Resharper 忽略的错误置于版本控制之下

c# - 定时器不会以多线程形式触发

c# - 当订阅者在发布者之前启动时,ZeroMQ PUB/C# SUB 不工作

data-structures - 按值检查结构与另一个结构

c# - C# 4.0 'dynamic' 关键字的优点和缺点?