c# editorconfig CA1062 具有可为空引用类型的空检查验证方法(用于保护子句)

c# editorconfig CA1062 null check validation methods (for guard clauses) with nullable reference types

我在解决方案中创建了一个小型 dotnetstandard 2.1 库项目。我想使用 Nullable Reference Types 进行测试。作为其中的一部分,我希望有适当的编译错误和警告。

TLDR; 我想知道如何在 .editorconfig 中正确设置 CA1062 代码质量设置。

图书馆项目

我已将以下 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>

这包括各种代码分析包以及 Steve Smith 不错的 Guard Clauses 库。

已在项目中使用 <Nullable>enable</Nullable> 启用可为 Null 的引用类型。

我有一个 class,在现实世界中这将是一个很好的实现,它实际上做了一些事情:

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

所以有了这个,当我编译时我得到以下内容:

到目前为止,一切都如我所料。我还没有使用任何守卫。

修复它 - Steve Smith 的 Guard 图书馆

所以让我们尝试实施 Steve Smiths Guard Library 中的 guard 子句来消除错误。

所以我们将以下内容添加到 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);

并将 .editorconfig 中的 null_check_validation_methods 替换为:

dotnet_code_quality.CA1062.null_check_validation_methods = FakeGuard.Validate

错误现在回来了。

问题

  1. 问题是,我需要什么才能使用具有来自同一解决方案的守卫的项目?
  2. 为什么我在错误 Window 中收到其他 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

我一直在检查这个 link MS Docs Code Quality 并尝试了 FakeGuard 的各种组合,包括:

奇怪的是,在不同的解决方案中,我没有收到关于错误 Window 中 CA1062 editorconfig 设置的任何投诉。在那里我无法让 null_check_validation_methods 工作 - 因此将这个解决方案放在一起。这已经困扰我一两个月了,但现在终于有精力把东西放在一起了。

EditorConfig 错误?

如果我将 FakeGuard 文件复制到库项目,则错误消息消失。但是为什么这在解决方案的不同项目中不起作用。

好的...我发布了 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();
        }
    }
}