当开关(枚举)未覆盖所有枚举值时是否可以发出警告AT COMPILE C#

K--*_*K-- 1 c# enums

所以我有

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

假设一开始我们只有猫和狗。而且我们已经写了数百万个使用switch(type)的func,例如SomeFunc。

现在我们介绍了Horse,因此我将把Horse应用于每个开关。

但是其他工作分支中的人并不知道这一增加。并且当它们的分支合并为master时,将在交换机中包含一些不包含Horse的func。

好吧,如果以后我们对每种类型进行单元测试,我们都可以获取异常,但我们负担不起。

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

Jon*_*eet 5

不,这是不可能的-至少不是开箱即用。C#中的switch语句不必是穷举的,也没有办法要求它们是穷举的。

(如果C#8中的switch 表达式不够详尽,则会发出警告,但现在可能对您没有帮助。)

可以 为此编写一个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>
Run Code Online (Sandbox Code Playgroud)

码:

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

结果:

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

我不能保证质量,您可能要配置启用该软件包中的哪些分析仪,但事实证明这是可能的。可能还有其他分析仪在做同样的事情-这只是我发现的第一个搜索结果。

  • @SirRufo:与 [代码](https://github.com/edumserrano/roslyn-analyzers/blob/master/Source/RoslynAnalyzers/Analyzers/AnalyzersMetadata/DiagnosticIdentifiers/EnumDiagnosticIdentifiers.c ) (2认同)