【问题标题】:Why does Resharper tell me there is a possible NullReferenceException?为什么 Resharper 告诉我可能存在 NullReferenceException?
【发布时间】:2020-01-13 15:40:02
【问题描述】:

我将 Rider 中的值分析模式切换为悲观,以突出显示每个“可能的 NullReferenceException”,在下面的示例中,我在“语言 [0]”部分有一个警告,我不明白为什么,因为我初始化了我的声明后立即收集。

那么它不应该为空。

我刚刚在一个空项目上进行了测试,我收到了同样的警告。

using System.Collections.Generic;

namespace ClassLibrary1
{
    public class Class1
    {
        public static string Current => Languages[0];

        public static readonly List<string> Languages = new List<string>
        {
            "en"
        };
    }
}

这是 ReSharper 犯的错误还是我遗漏了什么?

谢谢。

【问题讨论】:

  • 我没有收到此警告。您使用的是哪个版本的 R#?
  • 我不知道如何在 Rider (OS X) 上获取 R# 版本。如果相关的话,我的 Rider 版本是 2019.3。
  • 我的是 2019.3.1,但我不知道这是否真的会有所作为。
  • @cdauphin 你能发布一个可编译的重现控制台应用程序吗?
  • 是的,悲观会增加警告次数。

标签: c# resharper rider


【解决方案1】:

我认为静态属性是按出现的顺序评估的。尝试翻转它们,以便先有“语言”,然后有“当前”。

【讨论】:

【解决方案2】:

试试这个:

public static class Program
{
    public static readonly string Foo = Current;

    public static string Current => Languages[0];

    public static readonly List<string> Languages = new List<string>
    {
        "en"
    };

    public static void Main()
    {
        Console.WriteLine(Foo);
    }
}

SharpLab

静态成员按照声明的顺序进行初始化。 Foo 在分配Languages 之前被初始化,因此您会看到NullReferenceException

我猜 Resharper 在这里非常悲观,并且只考虑单独考虑 Current,而不管在初始化 Languages 之前是否真的有另一个静态成员可以访问它。


你也可能有类似这样的恶魔,Languages 的构造会导致访问Program.Current

public static class Program
{
    public static string Current => Languages[0].Value;
    public static readonly List<Language> Languages = new List<Language>() { new Language() };

    public static void Main()
    {
        Console.WriteLine(Current);
    }
}

public class Language
{
    public string Value { get; } = Program.Current;
}

(这是一个愚蠢的例子,但它表明 Resharper 可能比您预期的更难证明在 Program 的类型初始化程序完成运行之前没有任何东西访问 Program.Current)。

【讨论】:

  • 是的,这是来自 Resharper 的误报警告,至少对于 OP 发布的代码而言。
猜你喜欢
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
  • 2016-08-05
  • 1970-01-01
  • 1970-01-01
  • 2012-05-23
  • 1970-01-01
  • 2016-04-25
相关资源
最近更新 更多