c# – 而不是错误,为什么两个 *** 作数都不会被提升为float或double?

c# – 而不是错误,为什么两个 *** 作数都不会被提升为float或double?,第1张

概述1)如果一个 *** 作数是ulong类型,而另一个 *** 作数是sbyte / short / int / long类型,则发生编译时错误.我没有看到这个逻辑.因此,为什么两个 *** 作数被提升为double或float类型是不是一个坏主意? long L = 100; ulong UL = 1000; double d = L + UL; // error saying + ope 1)如果一个 *** 作数是ulong类型,而另一个 *** 作数是sbyte / short / int / long类型,则发生编译时错误.我没有看到这个逻辑.因此,为什么两个 *** 作数被提升为double或float类型是不是一个坏主意?
long L = 100;        ulong ul = 1000;        double d = L + ul; // error saying + operator can't be applIEd                              to operands of type ulong and long

b)编译器隐式地将int literal转换为字节类型并将结果值赋给b:

byte b = 1;

但是如果我们尝试为long类型(或类型int,byte等)分配ulong类型的文字,那么编译器会报告错误:

long L = 1000ul;

我认为编译器能够弄清楚常量表达式的结果是否适合long类型的变量?!

谢谢

解决方法 要回答标记为(1)的问题 – 添加有符号和无符号长度可能是一个错误.如果开发人员的意图是在这种情况下溢出到不精确的算术,那么他们应该通过将两个参数都转换为double来明确地做.隐含地这样做是为了更多地隐藏错误而不是做正确的事情.

回答标记为(b)的问题 – 当然编译器可以解决这个问题.显然它可以因为它对整数文字这样做.但同样,这几乎肯定是一个错误.如果你的意图是签名长,那你为什么把它标记为未签名?这看起来像是一个错误. C#经过精心设计,因此它会寻找像这样的奇怪模式并引起你的注意,而不是猜测你是想说出这个奇怪的东西并且在前方炽热,好像一切正​​常.编译器试图鼓励你编写合理的代码;敏感代码不会混合有符号和无符号类型.

总结

以上是内存溢出为你收集整理的c# – 而不是错误,为什么两个 *** 作数都不会被提升为float或double?全部内容,希望文章能够帮你解决c# – 而不是错误,为什么两个 *** 作数都不会被提升为float或double?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1241973.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存