Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在编译C时,当开关(枚举)未覆盖所有枚举值时,是否可能发出警告#_C#_Enums - Fatal编程技术网

C# 在编译C时,当开关(枚举)未覆盖所有枚举值时,是否可能发出警告#

C# 在编译C时,当开关(枚举)未覆盖所有枚举值时,是否可能发出警告#,c#,enums,C#,Enums,所以我有 public enum Type { Cat, Dog, Horse, } private void SomeFunc(Type type) { switch (type) { case Type.Cat: // ... break; case Type.Dog: // ... break; defa

所以我有

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();
    }
}
说一开始我们只有猫和狗。我们已经编写了数百万个函数,比如使用switch(type)的SomeFunc

现在我们引入了Horse,所以我将对每个开关应用Horse

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

如果我们以后对每种类型进行单元测试,我们可以得到异常,但我们负担不起


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

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

(如果C#8中的开关表达式不是详尽无遗的,则会给出警告,但这可能对您目前没有帮助。)

不过你可以为此付出代价。如果你以前写过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>
结果:

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


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

仅在新的开关中expressions@PanagiotisKanavos我认为你做不到。如果您只是简单地将开关大小写从上面转换为开关表达式,它不会抛出警告,因为它会有一个默认的
\=>
表达式。@Ramūnas这不是原因-默认值毕竟可以很容易地抛出,但这与当前的
大小写
没有什么不同。真正的原因是枚举只是整数,所以不可能进行彻底的匹配。这将附带一个C#9功能。因此,在新的开关表达式中,这将起作用。我本以为会看到来自@SirRufo的ENUM0003警告:与前面的相比,这里的文档似乎是错误的
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;
        }
    }
}