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

标签 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();
    }
}

假设一开始我们只有猫和狗。我们已经编写了数百万个函数,例如使用开关(类型)的 SomeFunc。

现在我们介绍了 Horse,所以我要将 Horse 应用于每个开关。

但是其他工作分支的人并不知道这个添加。而当他们的分支合并到master时,switches中会有一些不包含Horse的func。

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

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

最佳答案

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

(C# 8 中的 Switch expressions 会在它们不详尽时发出警告,但现在这可能对您没有帮助。)

可以 write a Roslyn analyzer为此。如果您之前编写过 Roslyn 分析器,我认为它相当简单。如果您之前没有编写过 Roslyn 分析器,虽然这是一项有趣的工作,但可能需要相当长的时间才能开始。

或者,使用第 3 方 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): warning ENUM0001: Add missing switch cases. A switch is considered incomplete if it is missing a possible value of the enum or the default case.

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

关于c# - 当开关(枚举)未覆盖每个枚举值时是否可以发出警告 AT COMPILE C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55757183/

相关文章:

c# - 未知的鉴别器值 C# Mongo

c# - 类型不可序列化,因为它不是公开的?

c# - 由于循环作用域回调引用导致 ninject 内存泄漏

Python enum.Enum 创建别名而不是新值

postgresql:枚举和字符变化,更新

java - 我应该尝试在 Java 中创建可逆枚举还是有更好的方法?

C# 强制静态字段初始化

Java Swagger UI - 如何正确配置枚举?

c# - Kendo 网格导出到 Excel 货币格式

c# - 使用正则表达式匹配 C# Unicode 标识符