За да огранича параметър за общ тип да бъде от тип enum, преди това ги ограничих по този начин, което беше най-доброто, което можех да отида за ограничаване на тип T за enums в преди C# 7.3:
void DoSomething<T>() where T : struct, IComparable, IConvertible, IFormattable
Сега C# 7.3 добавя нова функция за ограничаване на общ тип до System.Enum
. Опитах се да използвам ограничението enum с VS2017 15.7 актуализация, пусната днес и се компилира успешно, когато го напиша по този начин (като имам директива using System;
):
void DoSomething<T>() where T : Enum
Използването на ключовата дума enum
обаче не работи и кара компилатора да извежда следните грешки (следват още грешки, очаквайки тяло на метода, но не си струва да се споменава тук, предполагам):
void DoSomething<T>() where T : enum
^ error CS1031: Type expected
error CS1002: ; expected
^ error CS1001: Identifier expected
error CS1514: { expected
error CS1513: } expected
Тъй като има ограничение struct
, което работи за структури, не разбирам защо enum
не работи тук за enums. Вярно е, че enum
не се съпоставя с действителен тип, както int
би направил за Int32
, но реших, че трябва да се държи по същия начин като ограничението struct
.
Дали просто попаднах в капан на експериментална функция, която все още не е напълно внедрена, или това беше направено нарочно в спецификацията (защо?)?
string
е псевдоним за типаString
, същото не е вярно за ключовата думаenum
и типаEnum
. - person   schedule 07.05.2018struct
също не е псевдоним за определен тип, но е възможно. - person Ray   schedule 07.05.2018struct
е за типовете стойности, не само структура, подобно наclass
за всички референтни типове - person Mrinal Kamboj   schedule 07.05.2018enum
също трябваше да го направи. Относно вашата връзка: с C# 7.3 използването наEnum
(а не ключовата думаenum
) би било по-доброто решение сега. Въпросът е само защо ключовата дума не е предназначена да работи (в момента). - person Ray   schedule 07.05.2018