首页 > 解决方案 > 当似乎没有涉及“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涉及类型。

标签: c#

解决方案


您正在尝试^使用操作数intuint. 没有这样的运算符,因此两个操作数都转换为long并使用long ^(long, long)运算符。

ECMA C# 5 规范,第 12.4.7.1 节:

数值提升包括自动执行预定义的一元和二元数值运算符的操作数的某些隐式转换。数值提升不是一种独特的机制,而是将重载决议应用于预定义运算符的效果。数值提升具体不会影响用户定义的运算符的评估,尽管可以实现用户定义的运算符来展示类似的效果。

从 12.4.7.3 开始:

二进制数字提升发生在预定义的 +、–、*、/、%、&、|、^、==、!=、>、<、>= 和 <= 二元运算符的操作数上。二进制数字提升隐式地将两个操作数转换为一个公共类型,在非关系运算符的情况下,它也成为运算的结果类型。二进制数字提升包括应用以下规则,按照它们在此处出现的顺序:

  • ...(此处不适用的规则)
  • 否则,如果任一操作数为 uint 类型,而另一个操作数为 sbyte、short 或 int 类型,则这两个操作数都将转换为 long 类型。

推荐阅读