簡體   English   中英

當開關(枚舉)未覆蓋所有枚舉值時是否可以發出警告AT COMPILE C#

[英]Is it possible to give out a warning when switch (enum) does not cover every enum value AT COMPILE 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();
    }
}

假設一開始我們只有貓和狗。 而且我們已經寫了數百萬個使用switch(type)的func,例如SomeFunc。

現在我們介紹了Horse,因此我將把Horse應用於每個開關。

但是其他工作分支中的人並不知道這一增加。 並且當它們的分支合並為master時,將在交換機中包含一些不包含Horse的func。

好吧,如果以后我們對每種類型進行單元測試,我們都可以獲取異常,但我們負擔不起。

如果我們可以檢查所有情況是否都在每個開關(枚舉)中明確列出,那將是完美的。 有任何想法嗎? 甚至有可能(不包裹)?

不,這是不可能的-至少不是開箱即用。 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>

碼:

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:添加缺少的開關盒。 如果開關缺少枚舉的可能值或默認情況,則認為該開關不完整。

我不能保證質量,您可能要配置啟用該軟件包中的哪些分析儀,但事實證明這是可能的。 可能還有其他分析儀在做同樣的事情-這只是我發現的第一個搜索結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM