所以我有
School no 109
说起初我们只有猫和狗。而且我们已经写了数百万个使用switch(type)的func之类的功能,如SomeFunc。
现在,我们介绍了Horse,因此我将在每个开关上应用Horse。
但是其他工作分支中的人并不知道此添加。并且当它们的分支合并为master时,会有一些func在交换机中不包含Horse。
好吧,如果以后对每种类型进行单元测试,我们都可以获取异常,但我们负担不起。
如果我们可以检查是否所有情况都在每个开关(枚举)中明确列出,那将是完美的。有任何想法吗?甚至有可能(不包裹)?
答案 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:添加缺少的开关盒。如果开关缺少枚举的可能值或默认情况,则认为该开关不完整。
我不能保证质量,您可能要配置启用该程序包中的哪些分析仪,但这证明是可能的。可能还有其他分析仪在做同样的事情-这只是我发现的第一个搜索结果。