Передача неизвестного значения перечисления в функцию - PullRequest
0 голосов
/ 10 ноября 2011

Это разработка по этому вопросу: 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

Но это также даетмне ошибки компиляции.

Спасибо за помощь!

Ответы [ 3 ]

1 голос
/ 10 ноября 2011

Я думаю, что вопрос можно переформулировать как «как наложить общие ограничения на значение перечисления».

Джон Скит писал об этом здесь: http://msmvps.com/blogs/jon_skeet/archive/2009/09/10/generic-constraints-for-enums-and-delegates.aspx

Вопрос был задан ранее на SO

0 голосов
/ 10 ноября 2011

Вам также необходимо убедиться, что DoSomethingWithAnEnumeraterValue (item) напечатан так, чтобы соответствовать вашему T:

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

, где T ограничен так же, как CheckEnumerator.

0 голосов
/ 10 ноября 2011

Невозможно (я не смог найти способ, когда у меня возникла та же проблема) ограничить общее условие Enum.

ОБНОВЛЕНО

Ближайшее, что вы можете получить, этоa ValueType struct:

где T: ValueType

where T : struct

ПРИМЕЧАНИЕ: извинения, да, это было struct спасибок n8wrl.

...