NoWarn не работает в DNX

В моем тестовом проекте у меня есть частные поля, которые не назначены в коде, но назначаются с отражением.

При компиляции я получаю предупреждения вроде:

Предупреждение CS0649 Поле "CLASSNAME.FIELDNAME" никогда не назначается и всегда будет иметь значение по умолчанию null

Я попытался добавить <NoWarn>649</NoWarn> к первой PropertyGroup в xproj. Но я все еще получаю ошибки.

Не работает ли NoWarn в DNX? Или я делаю что-то неправильно? Есть ли другое решение проблемы?

Ответы

Ответ 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. И подумайте о том, чтобы чесать зуд, если вы не можете ждать, исправить это самостоятельно. Конечная выгода от проекта с открытым исходным кодом:)

Ответ 2

Параметры компилятора не могут быть указаны в файле xproj. Выполните следующие действия для подавления предупреждения компилятора:

  • Откройте файл project.json проекта. Все параметры компилятора должны быть указаны в этом файле.

  • Добавьте раздел compilationOptions в конец файла:

    "compilationOptions": {      "noWarn": [649] }

  • Сохраните файл и подождите несколько секунд, пока не увидите сообщение "Восстановить пакет" в строке состояния Visual Studio.

  • Восстановите проект.

Это должно подавить предупреждение. Однако иногда (возможно, ошибка) изменения, внесенные вами в project.json, не вступают в силу даже после чистой сборки. В этом случае, делая дополнительные фиктивные изменения в файле и перестраивая, обычно решает проблему.