Мне все еще интересно, есть ли решение для предотвращения этого предупреждения компилятора
Я предполагаю, что вы имеете в виду, кроме очевидного подхода #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 на языки попросите, чтобы это было добавлено как функция.Я думаю, это не будет серьезным изменением, поскольку этот синтаксис в настоящее время просто недопустим, и его разрешение не изменит поведение компилятора, когда вы не используете этот синтаксис.