Использование оператора C # 8 для прощения нулей в инициализаторах индекса C # 6 - PullRequest
0 голосов
/ 28 сентября 2019

При использовании инициализатора индекса для заполнения словаря без его воссоздания до этого, есть ли возможность указать где-нибудь оператор с нулевым прощением?

Пример:

public class Program
{
    public IDictionary<string, string>? NullableDictionary { get; set; }
       = new Dictionary<string, string>();

    public static void Main(string[] args)
    {
        new Program
        {
            NullableDictionary =
            {
                ["key"] = "value"
            }
        };
    }
}

Я знаю, что этот вариант использования (без воссоздания new Dictionary<string, string> до инициализации индекса { [...] = ... }), вероятно, не очень распространен.Но мне все еще интересно, есть ли решение для предотвращения этого предупреждения компилятора для приведенного выше случая:

[CS8602] Разыменование возможно нулевой ссылки.

Я мог быпредставьте, что вы используете нуль-прощающий оператор, например:

new Program
{
    NullableDictionary! =
    {
        ["key"] = "value"
    }
};

1 Ответ

0 голосов
/ 01 октября 2019

Мне все еще интересно, есть ли решение для предотвращения этого предупреждения компилятора

Я предполагаю, что вы имеете в виду, кроме очевидного подхода #pragma:

#pragma warning disable 8602
    new Program
    {
        NullableDictionary = { ["key"] = "value" }
    };
#pragma warning restore

Это, очевидно, работает.Или, конечно, специфическая версия «nullable ссылочных типов»:

#nullable disable
    new Program
    {
        NullableDictionary = { ["key"] = "value" }
    };
#nullable restore

Обе эти функции временно и явно отключают данное предупреждение.Оператор с нулевым прощением, по сути, делает это, за исключением, конечно, только конкретного выражения, к которому он применяется.

К лучшему или худшему, я не думаю, что есть способ сделать именно то, что вы хотите.Обычно синтаксис инициализатора коллекции допускается только в реальных объявлениях переменных.Использование его в контексте синтаксиса объект-инициализатора является особым случаем, который позволяет язык, основываясь на сходстве сценариев, даже если сгенерированный код сильно отличается от фактической инициализации переменной (и, в частности, где вы быфакт - инициализация значения переменной одновременно с инициализацией коллекции).

Таким образом, к тому времени, когда компилятор имеет дело с синтаксисом инициализатора вашей коллекции, все, что нужно компилятору, это то, что он генерируетнесколько вызовов метода Add(), и что эти вызовы выполняются со ссылочным значением, которое может быть нулевым, согласно вашей предыдущей декларации.

Все, что сказано, я нахожу вашу попытку использоватьНуль-прощающий оператор там вполне толковый.Было бы неплохо, если бы компилятор интерпретировал использование оператора в этом контексте, включив этот оператор в каждый генерируемый им вызов Add().

Возможно, вы даже сможете подать проблему Git на языки попросите, чтобы это было добавлено как функция.Я думаю, это не будет серьезным изменением, поскольку этот синтаксис в настоящее время просто недопустим, и его разрешение не изменит поведение компилятора, когда вы не используете этот синтаксис.

...