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

詹姆斯·高

此代码无法使用最新的C#编译器进行编译

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

public enum IntEnum : int { }

当您尝试编译它时,它会引发

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

奇怪的是,将强制转换值更改为正数(例如4),或者使用const值(例如int.MinValue),或者甚至将值括在括号中(IntEnum)(-1)都可以编译并正常工作。但是,上述示例没有。

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

阿列克谢·列文科夫(Alexei Levenkov)

行为是预期的,并已记录在案,以使表达式(Var)-1可以被解析。

编译器错误CS0075进入规格详细信息(我希望您代替CS0119或获得该错误):

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么C编译器允许从uint16_t静默转换为枚举类型?

为什么C#编译器允许空枚举?

为什么C#编译器会将此!=比较转换为>比较?

为什么编译器不警告强制转换为枚举?

为什么编译器给我这个不能从 CompletableFuture<Object> 转换为 CompletableFuture<String>

将单元转换为独立项目时,编译器为什么不能识别“导出”?

在某些情况下,为什么编译器只能将char *隐式转换为std :: string

在C#中为什么我可以将接口转换为任何类型而没有编译器错误

为什么C ++编译器可以将函数声明为constexpr,而不能将其声明为constexpr?

为什么编译器不能将const int绑定到右值引用?

为什么Rust编译器不能使用From特性将库错误转换为我的错误?

C#浮点文字:为什么编译器不默认为左侧变量类型

为什么C#编译器会在此代码上崩溃?

为什么不能将此字符串转换为文字?

为什么我不能将一列从一个枚举转换为另一个?

为什么Scala的编译器不能使用继承类型的隐式转换?

为什么编译器不能阻止这些运行时转换异常?

为什么我不能将此 css 转换为 xpath

为什么不能将双精度对象转换为字节?

Java:为什么我不能将int转换为Long

为什么不能将Object []转换为String []

为什么不能将RandomAccessFile强制转换为Inputstream?

为什么不能将测试 JSON 转换为日期时间?

为什么不能将函数指针转换为(void *)?

为什么不能将[](auto && ...){}转换为std :: function <void()>?

为什么我不能将其转换为 Int?

为什么不能将cin转换为自动声明的变量?

为什么不能将SEXP转换为Rcpp :: NumericMatrix?

为什么我不能将 Dataframe 列转换为整数?