V3195. Collection initializer implicitly calls 'Add' method. Using it on member with default value of null will result in null dereference exception.
Анализатор обнаружил, что в результате инициализации коллекции будет выброшено исключение типа 'NullReferenceException'. Это может произойти, если коллекция является свойством/полем, которое инициализируется на этапе создания объекта.
Рассмотрим пример:
class Container
{
public List<string> States { get; set; }
}
void Process(string? message)
{
var container = new Container
{
States = { "Red", "Yellow", "Green" }
};
}
В методе 'Process' создаётся объект типа 'Container'. На этапе создания объекта инициализируется список 'States'. При его инициализации будет выброшено исключение типа 'NullReferenceException'. Данное поведение обусловлено тем, что конструкция 'States = { "Red", "Yellow", "Green" }' раскрывается в три вызова метода 'Add' у свойства 'States'. По умолчанию объект типа 'List<string>' имеет значение 'null'. Следовательно, в данном случае метод 'Add' будет вызван у свойства, которое имеет значение 'null'.
Чтобы избежать возникновения исключения, можно присвоить значение свойству на этапе объявления:
class Container
{
public List<string> States { get; set; } = new List<string>();
}
Теперь при инициализации на этапе создания объекта класса исключения не будет.
Рассмотрим ещё один способ:
void Process(string? message)
{
var container = new Container
{
States = new() { "Red", "Yellow", "Green" }
};
}
В данном случае сначала будет создан объект списка с помощью 'new()', после чего в него будут добавлены элементы.
Данная диагностика классифицируется как: