【问题标题】:How to fix Code Analysis warning CS8605 when using foreach with Enum.GetValues()? [duplicate]将 foreach 与 Enum.GetValues() 一起使用时如何修复代码分析警告 CS8605? [复制]
【发布时间】:2020-07-02 14:27:48
【问题描述】:

考虑以下 .Net Core 3.1 代码:

using System;

namespace CoreConsoleA
{
    public static class Program
    {
        static void Main()
        {
            // Warning CS8605, Unboxing a possibly null value:
            foreach (MyEnum enumValue in Enum.GetValues(typeof(MyEnum))) 
            {
                Console.WriteLine(enumValue);
            }
        }
    }

    enum MyEnum { Zero, One, Two };
}

启用代码分析和可空性检查后,上面的代码会引发“警告 CS8605 将可能的空值拆箱”。

我可以使用“#pragma warning disable CS8605”来抑制警告。

我也可以这样写代码:

foreach (MyEnum? enumValue in Enum.GetValues(typeof(MyEnum)))
{
    Console.WriteLine(enumValue!.Value);
}

但这似乎有点奇怪,因为Enum.GetValues(typeof(MyEnum)) 不可能返回任何空值。

有没有更好的方法来解决这个问题?

【问题讨论】:

  • 您可以在GetValues 之后添加OfType<MyEnum>()Cast<MyEnum>()。问题可能是由于ArrayGetValue 方法返回object?

标签: c# code-analysis nullable-reference-types


【解决方案1】:

(回答我自己的问题,因为我刚刚意识到我应该做什么!)

您可以将Enum.GetValues() 的返回值转换为正确的类型,如下所示:

foreach (var enumValue in (MyEnum[]) Enum.GetValues(typeof(MyEnum)))
{
    Console.WriteLine(enumValue);
}

【讨论】:

  • foreach (var enumValue in Enum.GetValues(typeof(MyEnum)) as MyEnum[]) 似乎更具可读性。四处寻找这个我发现这个库看起来很有趣并且可能会有所帮助。 github.com/xin9le/FastEnum
  • foreach (MyEnum enumValue in Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>())
  • @asawyer 仍然发出警告(CS8602)
  • @GuruStron 这会产生额外的开销,涉及每个元素的反射 - 最好只进行一次强制转换,它只涉及一次反射检查(查看数组本身是否可转换,而不是数组的每个元素)
  • @MatthewWatson 是的,但我会说在大多数情况下差异并不大(与所有其他东西相比)。用 65 个值对枚举进行基准测试给了我 0.5µs 的差异。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 2022-01-13
  • 1970-01-01
相关资源
最近更新 更多