根据以下规则,表达式中的操作数是否被提升为更大的类型?

时间:2010-06-20 19:14:00

标签: c# operators implicit-conversion

如果数值表达式包含不同数值类型的操作数(常量和变量),则根据以下规则将操作数提升为更大的类型:

  1. 如果操作数类型为bytesbytecharshortushort,则会转换为int类型
  2. 如果其中一个操作数为int,则所有操作数都将转换为int
  3. 如果expression还包含类型为uintint的操作数,则所有操作数都将转换为long
  4. 如果其中一个操作数为long,则所有操作数都将转换为long
  5. 如果expression包含类型为ulonglong的操作数,则操作数将转换为float
  6. 如果其中一个操作数为float,则所有操作数都将转换为float
  7. 如果其中一个操作数为double,则所有操作数都将转换为double

  8. 假设数值表达式包含不同类型的操作数,所有操作数首先会转换为单个数字类型,然后运行时才会尝试计算结果吗?例如,如果变量b1b2属于byte类型,而i1属于int类型,则b1和b2 {{ 1}}在计算get之前转换为int:

    (b1+b2)

2 个答案:

答案 0 :(得分:1)

你的规则有一些事实要素,但在技术上是不精确的。

以下是C#语言规范

的相关摘录
  

7.2.6.2 Binary numeric promotions

     

对预定义+*/%&,{的操作数进行二进制数字提升{1}},|^==!=><>=二元运算符。二进制数字提升隐式地将两个操作数转换为公共类型,在非关系运算符的情况下,它也成为操作的结果类型。二进制数字促销包括按照它们在此处显示的顺序应用以下规则:

     
      
  • 如果任一操作数的类型为<=,则另一个操作数将转换为类型decimal,否则如果另一个操作数的类型为decimal或{{{}},则会发生编译时错误1}}。
  •   
  • 否则,如果任一操作数的类型为float,则另一个操作数将转换为double类型。
  •   
  • 否则,如果任一操作数的类型为double,则另一个操作数将转换为double类型。
  •   
  • 否则,如果任一操作数的类型为float,则另一个操作数将转换为类型float,否则如果另一个操作数的类型为ulong,则会发生编译时错误, ulongsbyteshort
  •   
  • 否则,如果任一操作数的类型为int,则另一个操作数将转换为long类型。
  •   
  • 否则,如果任一操作数的类型为long且另一个操作数的类型为longuintsbyte,则两个操作数都将转换为{{1}类型1}}。
  •   
  • 否则,如果任一操作数的类型为short,则另一个操作数将转换为int类型。
  •   
  • 否则,两个操作数都将转换为long类型。
  •   

  

uint

根据上述规范,是的,对于二元运算符uintint需要对int i2=(b1+b2)+i1进行二进制数字提升。

答案 1 :(得分:1)

括号的优先级高于+,因此转换通常会在添加b1b2之后进行。但是,+的{​​{1}}运算符does not have an overloadbyte必须首先提升为byte

进一步阅读: