0

这是对这个问题的详细说明:c# Enum Function Parameters

我创建了一个小示例应用程序来介绍我的问题:

更新:这是 C# 编程语言的一个已知困难。我在代码中为在搜索引擎中找到它的人添加了使用过的解决方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace FlexibleEnums
{
    class Program
    {
        public enum Color
        {
            Blue,
            Red,
            Green
        };

        static void Main(string[] args)
        {
            CheckEnum<Color>();
            Console.ReadKey();
        }

        private static void CheckEnum<T>()
        {
            foreach (T item in Enum.GetValues(typeof(T)))
            {
                Console.WriteLine(item);

                // And here is the question:
                // I would like to uncheck this line, but that does not compile!
                //DoSomethingWithAnEnumValue(item);

                // Solution:
                // Not so nice, but it works.
                // (In the real program I also check for null off cource!)
                DoSomethingWithAnEnumValue(item as Enum);


            }

        }

        private static void DoSomethingWithAnEnumValue(Enum e)
        {
            Console.WriteLine(e);
        }

    }
}

我认为我应该做类似的事情:

private static void CheckEnum<T>() where T : Enum

但这也给了我编译错误。

谢谢您的帮助!

4

4 回答 4

1

我认为这个问题可以重述为“如何对枚举值施加通用约束”。

Jon Skeet 在这里写了一篇博客:http: //msmvps.com/blogs/jon_skeet/archive/2009/09/10/generic-constraints-for-enums-and-delegates.aspx

该问题之前已在 SO 上提出过

于 2011-11-10T14:57:45.817 回答
0

将通用条件限制为 是不可能的(当我遇到同样的问题时我找不到方法)Enum

更新

你能得到的最接近的是:ValueType struct

其中 T :值类型

where T : struct

注意:抱歉,是的,这要struct归功于 n8wrl。

于 2011-11-10T14:51:47.060 回答
0

您还需要确保键入 DoSomethingWithAnEnumeraterValue(item) 以匹配您的 T:

private static void DoSomethingWithAnEnumeratorValue<T>(T item) where T : ...
{
}

其中 T 的限制方式与 CheckEnumerator 相同。

于 2011-11-10T14:55:27.610 回答
0

从 C#7.3 开始,可以创建枚举约束:枚举约束

public sealed class MyClass<T> : MyBaseClass, IMyInterface<T> where T : Enum
{
        public MyClass(Args args)
            : base(args)
        {
        }
}

我需要消费者传入几个枚举之一,其中枚举必须存在于特定的命名空间中。如果使用了不同的枚举,我会抛出运行时异常:

public sealed class MyClass<T> : MyBaseClass, IMyInterface<T> where T : Enum
{
        public MyClass(Args args)
            : base(args)
        {
            var t = typeof(T);
            if (t.Namespace.IsNotContaining("My.Namespace.Of.Interest"))
            {
#pragma warning disable CA1303 // Do not pass literals as localized parameters
                throw new InvalidEnumArgumentException("The enum provided was not of the expected type.");
#pragma warning restore CA1303 // Do not pass literals as localized parameters
            }
        }
}

于 2020-05-27T09:51:52.303 回答