0

これは、この質問の詳細です。c#列挙型関数パラメーター

私の質問を紹介するために、小さなサンプルアプリケーションを作成しました。

更新:これは、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:ValueType

where T : struct

注:お詫びします。はい、structn8wrlのおかげです。

于 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)
        {
        }
}

コンシューマーがいくつかの列挙型の1つを渡す必要がありました。この場合、列挙型は特定の名前空間に存在する必要がありました。別の列挙型が使用された場合、実行時例外をスローしました。

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 に答える