c# - 当似乎没有涉及“long”类型时,无法将类型“long”隐式转换为“int”
问题描述
另一个跟踪错误的帖子Cannot implicitly convert type 'long' to 'int'
public int FindComplement(int num) {
uint i = 0;
uint mask = ~i;
while((mask&num) != 0) mask <<= 1;
//return ~mask^num; //<-- error CS0266
return (int)~mask^num; //<--it works with (int)
}
抱歉问题太多,我想知道为什么return ~mask^num
会导致错误
错误 CS0266:无法将类型“long”隐式转换为“int”。存在显式转换(您是否缺少演员表?)
在我的环境中,return ~mask^num;
会导致错误,而return (int)~mask^num
可以工作。而且这里似乎没有long
涉及类型。
解决方案
您正在尝试^
使用操作数int
和uint
. 没有这样的运算符,因此两个操作数都转换为long
并使用long ^(long, long)
运算符。
从ECMA C# 5 规范,第 12.4.7.1 节:
数值提升包括自动执行预定义的一元和二元数值运算符的操作数的某些隐式转换。数值提升不是一种独特的机制,而是将重载决议应用于预定义运算符的效果。数值提升具体不会影响用户定义的运算符的评估,尽管可以实现用户定义的运算符来展示类似的效果。
从 12.4.7.3 开始:
二进制数字提升发生在预定义的 +、–、*、/、%、&、|、^、==、!=、>、<、>= 和 <= 二元运算符的操作数上。二进制数字提升隐式地将两个操作数转换为一个公共类型,在非关系运算符的情况下,它也成为运算的结果类型。二进制数字提升包括应用以下规则,按照它们在此处出现的顺序:
- ...(此处不适用的规则)
- 否则,如果任一操作数为 uint 类型,而另一个操作数为 sbyte、short 或 int 类型,则这两个操作数都将转换为 long 类型。
推荐阅读
- javascript - 使用 DataTables 时如何维护 Ember Data 双向绑定?
- python - Hough Circles 打开 CV 错误
- unit-testing - 在 Qpid 代理中创建 Exchange 和队列
- jquery - Ajax 将数据移动到另一个 div
- php - 删除特定联系表 7 挂钩
- r - 从 MYSQL VIEW 表中提取数据到 Rstudio
- java - InvalidQueryException despite of correct query
- java - 如何在java中将字节[]转换为Mat
- android - Flutter 渲染问题
- plsql - 在 oracle 数据库中创建 XML 到 XSD 规范