c# editorconfig CA1062 методы проверки нулевой проверки (для защитных предложений) с нулевыми ссылочными типами

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

TLDR; Я хочу знать, как правильно настроить параметры качества кода CA1062 в .editorconfig.

Библиотечный проект

Я добавил в проект следующие nuget пакеты:

<ItemGroup>
      <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="2.9.8">
          <PrivateAssets>all</PrivateAssets>
          <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      </PackageReference>
      <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8">
          <PrivateAssets>all</PrivateAssets>
          <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      </PackageReference>
      <PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
        <PackageReference Include="Ardalis.GuardClauses" Version="1.4.2" />
  </ItemGroup>

Сюда входят различные пакеты анализа кода, а также прекрасная библиотека Guard Clauses Стива Смита.

Обнуляемые ссылочные типы были включены с помощью <Nullable>enable</Nullable> в проекте.

И у меня есть класс, который в реальном мире был бы хорошей реализацией, которая действительно что-то делала:

using System;
using MyGuards;

namespace EditorConfigIssues
{
    public static class TestEditorConfig
    {
        public static void TestMethod(MyParam input)
        {
            string x = input.Check;
            Console.WriteLine(x);
        }
    }

    public class MyParam
    {
        public MyParam(string check) => Check = check;

        public string Check { get; }
    }
}

Проект библиотеки гвардии

В решении я добавил простую библиотеку Guard, которая является еще одним проектом dotnetstandard 2.1.

using System;

namespace MyGuards
{
    public static class FakeGuard
    {
        public static void Validate(object obj)
        {
            if (obj == null)
                throw new ArgumentNullException();
        }
    }
}

ПРИМЕЧАНИЕ. Это не конкурирует с библиотекой GuardClauses — просто используйте для сравнения с editorconfig!

.editorconfig

Я добавил .editorconfig в корень решения со следующими диагностическими проверками:

dotnet_diagnostic.CA1062.severity = error
dotnet_code_quality.CA1062.exclude_extension_method_this_parameter = true

Таким образом, при компиляции я получаю следующее: Ошибки

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

Исправляем это - Библиотека гвардии Стива Смита

Итак, давайте попробуем реализовать предложения защиты из библиотеки защиты Стива Смита, чтобы избавиться от ошибки.

Итак, мы добавляем следующее к TestEditorConfig.TestMethod:

Guard.Against.Null(input, nameof(input));

и настройте .editorconfig с помощью:

dotnet_code_quality.CA1062.null_check_validation_methods = Ardalis.GuardClauses.Guard.Against.Null

Отлично, все хорошо. Ошибка исчезла. Исходная ошибка устранена

Исправляем - моя собственная библиотека охраны

Но теперь я хочу использовать собственную защиту. Поэтому мы заменяем начальную проверку защиты в TestEditorConfig.TestMethod на:

FakeGuard.Validate(input);

и замените null_check_validation_methods в .editorconfig на:

dotnet_code_quality.CA1062.null_check_validation_methods = FakeGuard.Validate

Ошибка вернулась.
введите здесь описание изображения

Вопросы)

  1. Вопрос, что мне нужно для того, чтобы использовать проект с гвардией из того же решения?
  2. Почему я получаю предупреждения для другого CA1062 в окне ошибок?
The keyword "dotnet_code_quality.CA1062.exclude_extension_method_this_parameter" is unknown
The keyword "dotnet_code_quality.CA1062.null_check_validation_methods" is unknown

Я проверял эту ссылку MS Docs Code Качество и испробовали различные комбинации для FakeGuard, в том числе:

  • MyGuards
  • MyGuards.FakeGuard
  • FakeGuard
  • MyGuards.FakeGuard.Validate
  • FakeGuard.Проверить
  • Подтвердить

Любопытно, что в другом решении я не получаю жалоб на настройки редактора CA1062 в окне ошибок. И там мне не удалось заставить работать null_check_validation_methods, поэтому я собрал это решение. Это беспокоило меня в течение месяца или двух, но, наконец, я получил энергию, чтобы собрать вещи воедино.

Ошибка EditorConfig?

Если я скопирую файл FakeGuard в проект библиотеки, то сообщение об ошибке исчезнет. Но почему это не работает в другом проекте в решении.


person Andez    schedule 26.03.2020    source источник


Ответы (1)


ОК... Я написал о проблемах roslyn-analyzers - здесь - https://github.com/dotnet/roslyn-analyzers/issues/3451

Как оказалось это баг. На данный момент предлагаемый обходной путь:

using System;

[AttributeUsage(AttributeTargets.Parameter)] 
internal sealed class ValidatedNotNullAttribute : Attribute { } 

namespace MyGuards
{
    /// <summary>
    /// Checks stuff.
    /// </summary>
    public static class FakeGuard
    {
        /// <summary>
        /// No more nulls.
        /// </summary>
        /// <param name="obj"></param>
        public static void Validate([ValidatedNotNull] object obj)
        {
            if (obj == null)
                throw new ArgumentNullException();
        }
    }
}

person Andez    schedule 04.04.2020