Попробуйте это:
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
Stati c члены инициализируются в порядке их объявления. Foo
инициализируется до присвоения Languages
, и поэтому вы видите NullReferenceException
.
Я предполагаю, что Решарпер очень пессимистичен c здесь и рассматривает только Current
в изоляции, независимо от есть ли на самом деле другой элемент stati c, который может получить к нему доступ до инициализации 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.Current
до завершения работы инициализатора типа Program
, чем вы могли бы ожидать).