微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 而不是错误,为什么编译器不会将两个文字提升为long类型?

以下两个语句将导致编译器溢出错误(原因是认情况下检查常量表达式是否溢出):

int i=(int)(int.MaxValue+100); // error
long l=(long)(int.MaxValue+100); // error

但是,如果编译器能够确定添加这两个值会导致溢出,那么为什么它不会将int.MaxValue和100都提升为long而只是尝试将它们一起添加?据我所知,这应该不是问题,因为根据以下引用,整数文字也可以是long类型:

When an integer literal has no suffix,
its type is the first of these types
in which its value can be represented:
int,uint,long,ulong.

感谢名单

解决方法

我想,简短的回答是因为它没有被设计成.每当MS向C#编译器添加功能时(或者当任何人向任何东西添加功能时),都必须进行成本效益分析.人们不得不想要这个功能,实现该功能的成本(在时间编码和测试方面以及可以实现的其他一些功能的机会成本)必须超过该功能为开发人员提供的潜在好处.

在您的情况下,让编译器执行您想要的操作的方法是简单,明显和清晰.如果他们补充:

Infer the type of a numeric expression consisting only of constants and literals to be the minimal type that can contain the resulting value

这意味着他们现在有更多的代码路径来检查和更多的单元测试.改变预期的行为也意味着可能有人依赖于这个记录的事实,其代码现在将无效,因为推论可能不同.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐