Ответ 1
Конечно, странно, что теперь он работает с С# 6. В текущей спецификации выполнения по-прежнему отображается следующая грамматика для указания базы в перечислениях перечислений:
enum_base
: ':' integral_type
;
И интегральные типы определяются как актуальные фиксированные токены:
integral_type
: 'sbyte'
| 'byte'
| 'short'
| 'ushort'
| 'int'
| 'uint'
| 'long'
| 'ulong'
| 'char'
;
Судя по этой спецификации языка, использование некоторого другого базового типа, который не отображается в этом списке идентификаторов статического типа, должен быть отклонен парсером и вызвать синтаксическую ошибку.
Учитывая, что это не то, что происходит, есть две возможности: либо парсер был изменен намеренно, чтобы принять там не сглаженные типы, либо парсер неправильно принял их.
Если мы посмотрим на реализацию Roslyn, тогда мы увидим, почему это требование в спецификации не применяется. Анализатор объявления enum просто не проверяет его, а анализирует любой тип:
BaseListSyntax baseList = null;
if (this.CurrentToken.Kind == SyntaxKind.ColonToken)
{
var colon = this.EatToken(SyntaxKind.ColonToken);
var type = this.ParseType(false);
var tmpList = _pool.AllocateSeparated<BaseTypeSyntax>();
tmpList.Add(_syntaxFactory.SimpleBaseType(type));
baseList = _syntaxFactory.BaseList(colon, tmpList);
_pool.Free(tmpList);
}
На данный момент это не сильно отличается от кода для "нормального" наследования. Поэтому любое ограничение типа не применяется на уровне синтаксиса, но на семантическом уровне - в котором псевдоним типа точки, вероятно, уже оценивается.
Так что это кажется ошибкой: либо в спецификации, либо в синтаксическом анализаторе. Учитывая, что спецификация все еще работает, это может быть исправлено позже.