另一则跟踪错误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
类型。
答案 0 :(得分:4)
您正在尝试对操作数^
和int
执行uint
操作。没有这样的运算符,因此将两个操作数都转换为long
并使用long ^(long, long)
运算符。
在ECMA C# 5 specification中,第12.4.7.1节:
数字升级包括自动执行以下操作数的某些隐式转换 预定义的一元和二进制数值运算符。数值提升不是一个独特的机制,但是 而是将过载解析应用于预定义运算符的效果。数值促销 尽管用户定义的运算符可以是 表现出相似的效果。
从12.4.7.3开始:
预定义的+,–,*,/,%,&,|,^,==,!=,>,<,> =, 和<=二进制运算符。二进制数值提升将两个操作数隐式转换为通用类型 对于非关系运算符,它也成为运算的结果类型。二元 数字促销包括按照以下规则在此处出现的顺序进行应用:
- ...(不适用于此处的规则)
- 否则,如果其中一个操作数的类型为uint,而另一个操作数的类型为sbyte,short或int, 这两个操作数都转换为long类型。
答案 1 :(得分:0)
uint类型保存从0到4,294,967,295的数字。这意味着当您将常规int用作参数num时,您将对具有两个不同范围的两种不同类型进行操作。因此,为了不出现此错误,可以对所有内容使用int。