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
错误现在回来了。
问题
- 问题是,我需要什么才能使用具有来自同一解决方案的守卫的项目?
- 为什么我在错误 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 的各种组合,包括:
- 我的卫士
- MyGuards.FakeGuard
- FakeGuard
- MyGuards.FakeGuard.验证
- FakeGuard.Validate
- 验证
奇怪的是,在不同的解决方案中,我没有收到关于错误 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();
}
}
}
我在解决方案中创建了一个小型 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
错误现在回来了。
问题
- 问题是,我需要什么才能使用具有来自同一解决方案的守卫的项目?
- 为什么我在错误 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 的各种组合,包括:
- 我的卫士
- MyGuards.FakeGuard
- FakeGuard
- MyGuards.FakeGuard.验证
- FakeGuard.Validate
- 验证
奇怪的是,在不同的解决方案中,我没有收到关于错误 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();
}
}
}