当似乎不涉及“ long”类型时,无法将类型“ long”隐式转换为“ int”

时间:2019-04-03 10:57:02

标签: c#

另一则跟踪错误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类型。

2 个答案:

答案 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。