[英]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.