首页 > 解决方案 > 将 foreach 与 Enum.GetValues() 一起使用时如何修复代码分析警告 CS8605?

问题描述

考虑以下 .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))不可能返回任何空值。

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

标签: c#code-analysisnullable-reference-types

解决方案


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

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

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

推荐阅读