Перечислимые ограничения типа в C# [дубликат]

У меня просто было это также. Я нашел, что это помогло:

sudo aptitude install telepathy-haze

Затем открывают клиент Чата и Ctrl-Q для выхода из него полностью, затем выполняют его снова и пытаются добавить учетную запись снова, и это работает (или это забрало мои старые учетные записи так или иначе).

149
задан Community 23 May 2017 в 10:31
поделиться

3 ответа

Это функция, которую иногда запрашивают.

Как я люблю отмечать, ВСЕ функции не реализованы, пока кто-то не разработает, не разработает спецификации, не реализует, не протестирует, не задокументирует и не отправит эту функцию. Пока этого никто не сделал. Нет ничего необычного, почему бы и нет; у нас есть много других дел, ограниченные бюджеты, а этот никогда не обходился без ответа "разве это не было бы хорошо?" обсуждение в группе разработчиков языка.

CLR не поддерживает его, поэтому для того, чтобы заставить его работать, нам нужно было бы выполнять работу во время выполнения в дополнение к работе с языком. (см. комментарии к ответу)

Я вижу несколько достойных вариантов использования, но ни один из них не является настолько убедительным, чтобы мы выполняли эту работу, а не одну из сотен других функций, которые запрашиваются гораздо чаще, или иметь более убедительные и перспективные варианты использования. (Если мы собираемся испортить этот код, я

92
ответ дан 23 November 2019 в 22:26
поделиться

На самом деле, это возможно, но с уродливой уловкой. Однако его нельзя использовать для методов расширения.

public abstract class Enums<Temp> where Temp : class {
    public static TEnum Parse<TEnum>(string name) where TEnum : struct, Temp {
        return (TEnum)Enum.Parse(typeof(TEnum), name); 
    }
}
public abstract class Enums : Enums<Enum> { }

Enums.Parse<DateTimeKind>("Local")

При желании вы можете предоставить Enums частный конструктор и открытый вложенный абстрактный унаследованный класс с Temp как Enum , чтобы предотвратить унаследованные версии для не перечислений.

Обратите внимание, что вы не можете использовать этот трюк для создания методов расширения.

146
ответ дан 23 November 2019 в 22:26
поделиться

Одна странность заключается в том, что вы, возможно, захотите написать достаточно много общих методов Enum, реализация которых зависит от «базового» типа перечисления.

Под «базовым» типом перечисления, E , я подразумеваю тип в пространстве имен System , имя которого совпадает с именем члена Перечисление System.TypeCode , полученное путем вызова System.Type.GetTypeCode (System.Type) для типа E . Если перечисление было объявлено на C #, это тот же тип, от которого он был объявлен как «наследуемый» (я не уверен, как это официально называется в спецификации). Например, базовым типом перечисления Animal ниже является System.Byte :

public enum Animal : byte
{
    Moose,
    Squirrel
}

Можно написать такие методы с помощью операторов switch, но это, конечно, некрасиво, вы можете ' t получить строго типизированные параметры или возвращаемые типы, тип которых является базовым типом перечисления, и вам нужно либо повторить поиск метаданных, либо выполнить некоторое кэширование (например, в статическом конструкторе для универсального типа, содержащего метод).

2
ответ дан 23 November 2019 в 22:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: