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;
}
}
}