加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 20:51:18 所属栏目:百科 来源:网络整理
导读:以下两个语句将导致编译器溢出错误(原因是默认情况下检查常量表达式是否溢出): int i=(int)(int.MaxValue+100); // errorlong l=(long)(int.MaxValue+100); // error 但是,如果编译器能够确定添加这两个值会导致溢出,那么为什么它不会将int.MaxValue和100都
以下两个语句将导致编译器溢出错误(原因是默认情况下检查常量表达式是否溢出):

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读