为什么C#编译器不能将枚举负值转换为枚举?

Jam*_* Ko 5 .net c# enums casting roslyn

此代码不能使用最新的C#编译器进行编译:

public class Program
{
    public static void Main()
    {
        IntEnum a = (IntEnum)-1;
    }
}

public enum IntEnum : int { }
Run Code Online (Sandbox Code Playgroud)

当你试图编译它时,它会引发

(3,22,3,29):错误CS0119:'IntEnum'是一种类型,在给定的上下文中无效

奇怪的是,将转换值更改为正数(例如4),或使用const值(例如int.MinValue),或者甚至用括号括起来的值(IntEnum)(-1)将编译并正常工作.但是,上述样本没有.

这有什么理由吗?是否有可能Roslyn可能错误地解析了代码,这就是为什么错误会被提升?

Ale*_*kov 7

期望并记录行为以允许(Var)-1解析表达式.

编译器错误CS0075进入规范细节(我希望你得到这个错误/除了CS0119):

要转换负值,必须将值括在括号中如果使用标识预定义类型的关键字进行转换,则不需要括号.否则,必须放括号,因为(x)-y不会被视为强制转换表达式.从C#规范,第7.6.6节:

根据消歧规则,如果x和y是标识符,则(x)y,(x)(y)和(x)( - y)是强制转换表达式,但(x)-y不是,甚至如果x标识一个类型.但是,如果x是标识预定义类型(例如int)的关键字,则所有四种形式都是强制转换表达式(因为这样的关键字本身不可能是表达式).

  • 注意到这对C#6编译器来说并不陌生,我确实看到一个显着的区别是在C#5中,错误包括CS0075,它明确地解释了这个问题,而那个错误或等价物在C#6中没有显示.恕我直言,那部分实际上是一个bug,因为它是旧编译器的回归. (2认同)