当开关(枚举)未覆盖编译 C# 时的每个枚举值时是否可以发出警告



所以我有

public enum Type
{
Cat,
Dog,
Horse,
}
private void SomeFunc(Type type)
{
switch (type)
{
case Type.Cat:
// ...
break;
case Type.Dog:
// ...
break;
default:
throw new System.Exception();
}
}

假设一开始我们只有猫和狗。我们已经编写了数百万个像SomeFunc这样使用switch(类型)的功能。

现在我们介绍了 Horse,所以我将把 Horse 应用到每个开关上。

但是其他工作部门的人并不知道这一点。并且当他们的分支合并到master中时,开关中会有一些不包含Horse的功能。

好吧,如果我们以后对每种类型进行单元测试,我们可以得到异常,但我们不能这样做。

如果我们可以检查是否在每个开关(枚举)中明确列出了所有情况,那将是完美的。有什么想法吗?甚至可能(没有包装)吗?

不,这是不可能的——至少不是开箱即用的。C# 中的 switch 语句不必详尽无遗,也没有办法要求它们详尽无遗。

(如果 C# 8 中的切换表达式不详尽,它们会发出警告,但现在可能没有帮助。

不过,您可以为此编写一个 Roslyn 分析器。如果你之前写过Roslyn分析器,我希望它是相当微不足道的。如果您以前没有编写过Roslyn 分析器,则可能需要相当长的时间才能开始,尽管这是一项有趣的工作。

或者,使用第三方 Roslyn 分析器。我刚刚找到了一个似乎有效的方法,但我还没有深入地玩过它。下面是一个示例:

项目文件:

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Roslyn.Analyzers" Version="1.0.3.4" PrivateAssets="All" />
</ItemGroup>
</Project>

法典:

using System;
enum Color
{
Red, Green, Blue
}
sealed class Program
{
static void Main(string[] args)
{
Color c = Color.Red;
switch (c)
{
case Color.Red:
Console.WriteLine("Red");
break;
case Color.Green:
Console.WriteLine("Green");
break;
//            case Color.Blue:
//                Console.WriteLine("Blue");
//                break;
default:
Console.WriteLine("Undefined color");
break;
}
}
}

结果:

程序.cs(14,9):警告ENUM0001:添加缺少的开关案例。如果开关缺少枚举的可能值或默认情况,则认为开关不完整。

我不能保证质量,您可能希望配置该包中的哪些分析器已启用,但它证明这是可能的。很可能还有其他分析器可以做同样的事情 - 这只是我找到的第一个搜索结果。

最新更新