c# editorconfig CA1062 методы проверки на нулевую проверку (для охранных предложений) с обнуляемыми ссылочными типами - PullRequest
0 голосов
/ 26 марта 2020

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

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 были включены с помощью <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 Library Project

В решении, которое я добавил простая библиотека 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 к root решения со следующими проверками диагностики c:

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

Итак, при компиляции я получаю следующее: Errors

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

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

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

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

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

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

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

Отлично, все хорошо. Ошибка исчезла. Initial error gone

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

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

FakeGuard.Validate(input);

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

dotnet_code_quality.CA1062.null_check_validation_methods = FakeGuard.Validate

Ошибка теперь вернулась.
enter image description here

Вопрос (ы)

  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 Quality и пытался различные комбинации для FakeGuard, в том числе:

  • MyGuards
  • MyGuards.FakeGuard
  • FakeGuard
  • MyGuards.FakeGuard.Validate
  • FakeGuard.Validate
  • Validate

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

Ошибка EditorConfig?

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

1 Ответ

0 голосов
/ 04 апреля 2020

ОК ... Я писал о 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();
        }
    }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...