C# CSharp通过可为空的枚举进行枚举

C# CSharp通过可为空的枚举进行枚举,c#,enums,C#,Enums,一段代码胜过千言万语 public enum enTest { a, b, c } public void PrintEnum<T>() { foreach (var E in Enum.GetValues(typeof(T))) Debug.WriteLine(E.ToString()); } PrintEnum<enTest>(); PrintEnum<enTest?>(); // This will cause failure

一段代码胜过千言万语

public enum enTest { a, b, c }

public void PrintEnum<T>()
{
    foreach (var E in Enum.GetValues(typeof(T)))
    Debug.WriteLine(E.ToString());
}

PrintEnum<enTest>();
PrintEnum<enTest?>();    // This will cause failure in Enum.GetValues()
public enum enTest{a,b,c}
public void PrintEnum()
{
foreach(Enum.GetValues中的变量E(typeof(T)))
Debug.WriteLine(例如ToString());
}
PrintEnum();
PrintEnum();//这将导致Enum.GetValues()中出现故障
以上是从一个更大的问题简化而来的,以说明故障

有谁知道当有人向我传递一个可为空的枚举时,我如何迭代(或获取其中的所有值)

提前谢谢。

这个怎么样

public static void PrintEnum<T>()
        {
            Type t = typeof (T);
            if (t.IsGenericType)
            {
                //Assume it's a nullable enum
                t = typeof (T).GenericTypeArguments[0];
            }

            foreach (var E in Enum.GetValues(t))
                Console.WriteLine(E.ToString());
        }
publicstaticvoidprintenum()
{
类型t=类型(t);
if(t.IsGenericType)
{
//假设它是一个可为空的枚举
t=typeof(t).GenericTypeArguments[0];
}
foreach(Enum.GetValues(t)中的变量E)
Console.WriteLine(如ToString());
}

有帮助吗?“一段代码抵得上千言万语…”-但显示错误也会有很大帮助。。。除了在示例中使用常规名称之外,还有一点误解,即您有“可为null的int”或“可为null的enum”。实际上,您没有,您拥有的是一个可以保存int或enum的类型,并且还具有null的概念,但是这个类型既不是int也不是enum,它是一个可以为null的值,保存int或enum。编译器中有编译器魔法来处理这个问题,并从表达式中的可空值中提升/提升可空类型值。所以基本上,没有人给你传递一个可为null的枚举,他们给你传递的是一个
nullable
,它不是一个枚举,但T是一个枚举。因此,您需要获得T。正如@germi所提到的,使用nullable.getUnderlyngType将返回所需的类型,并且由于如果不是nullable,它将返回null,因此您可以简单地合并以保证其正常使用的安全:
Enum.GetValues(nullable.getUnderlyngType(typeof(T))??typeof(T)))
一个附带问题是,如果该方法被传递一个持有枚举的
null
,那么该方法是否也应该将“null”打印为合法值?改进:
t=t.Generic….
还有se DavidG对该问题的评论,这使得它更加简单。Me.Name的enum.GetValues(Nullable.getunderyingtype(typeof(t))??typeof(t))好多了。