Ответ 1
Пример кода:
class Example {
private string warningHere; // CS0649
void UseField() {
Console.WriteLine(warningHere);
}
}
Вам нужно убедить компилятор, что вы знаете, что делаете, он отказывается рассматривать возможность использования Reflection для вызывания значения в поле. Это довольно просто:
private string warningHere = null; // Fine
Вы можете возразить: "Но это совершенно бессмысленно! CLR уже инициализирует поле нулевым!". Это, безусловно, так. Однако никакого вреда не было, устранение лишнего кода, как это делает оптимизатор дрожания. Это особенно полезно при удалении ненужных присваиваний нулей.
Я мог бы иметь
<NoWarn>0649</NoWarn>
в csproj
Имейте в виду, что это эквивалентно решению локальной проблемы с глобальным кувалдой. Это предупреждение очень важно, вы хотите, чтобы оно имело силу для всего кода, который вы компилируете. Чтобы продемонстрировать, в приведенном выше фрагменте кода class
до struct
, сохраните код отражения одинаковым. Обратите внимание, что вы не можете получить поле warningHere
для значения. Побочный эффект структуры, получаемой коробкой до ее передачи в FieldInfo.SetValue(), обновляется только вставка в коробке. Это неприятная ошибка для диагностики, если у вас нет предупреждения, чтобы предупредить вас.
Использование #pragma warning
в источнике является нормальным, но не превосходенным, слишком легко забыть его восстановить.
Проект переключился на создание с MSBuild всего два месяца назад, убедитесь, что вы не слишком стары, и вы тоже переключились. Вы можете указать ошибку в github, чтобы напомнить им, если функция все еще awol. И подумайте о том, чтобы чесать зуд, если вы не можете ждать, исправить это самостоятельно. Конечная выгода от проекта с открытым исходным кодом:)