所以我有
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/