1

当我写这样的东西时:

using (var connection = new SqlConnection("ConnectionString"))
{
    using(var cmd= new SqlCommand("Command"))
    {
        using (var reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
            }
        }
    }
}

ReSharper 显示警告reader.Read(),并告诉读者可以null

但在什么情况下它可以为空?据我所知,如果命令不返回任何内容,则阅读器不为空,它什么都没有。

4

2 回答 2

5

鉴于这在 YouTrack 上被报告为错误(两次 -此处此处),看起来 R# 附带的无效注释在这方面存在缺陷。

查看您的ReSharper_installation_dir\Bin\ExternalAnnotations文件夹 - 这是安装注释文件的位置。对我来说,使用 v5,这里有一个System.Data\System.Data.Nullness.xml包含此注释的文件:

<member name="M:System.Data.SqlClient.SqlCommand.ExecuteReader">
  <attribute ctor="M:JetBrains.Annotations.CanBeNullAttribute.#ctor" />
</member>

如果通过您自己的检查,您认为这是错误的,并且SqlCommand.ExecuteReader永远不会返回 null,您应该将其更改为

<member name="M:System.Data.SqlClient.SqlCommand.ExecuteReader">
  <attribute ctor="M:JetBrains.Annotations.NotNullAttribute.#ctor" />
</member>
于 2010-06-14T08:04:28.233 回答
1

我认为它不能为 null - 但 resharper 不知道它SqlCommand.ExeuteReader()永远不会返回 null。
据我所知,他们使用一些 xml 来告诉女巫函数可能返回也可能不返回 null,并且可以在那里设置。我不知道 xml 的名称和位置。

于 2010-06-14T07:37:07.720 回答