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

时间:2019-04-19 05:47:38

标签: c# enums

所以我有

School no 109

说起初我们只有猫和狗。而且我们已经写了数百万个使用switch(type)的func之类的功能,如SomeFunc。

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

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

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

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

1 个答案:

答案 0 :(得分:4)

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

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

可以 write a Roslyn analyzer。如果您之前写过罗斯林分析仪,那我认为它是微不足道的。如果您以前没有编写过罗斯林分析仪,那么这可能会花费相当长的时间,尽管这是一项有趣的工作。

或者,使用第三方Roslyn分析仪。我刚刚found one似乎有效,但是我没有深入研究它。这是一个示例:

项目文件:

<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;
        }
    }
}

结果:

  

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

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