# 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()', после чего в него будут добавлены элементы.

Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки разыменования нулевого указателя/нулевой ссылки [* см. примечание касательно языков C#, Java].

Данная диагностика классифицируется как:

CWE-476