short s1=1; 
s1=s1+1;    //错误 1 无法将类型“int”隐式转换为“short”。存在一个显式转换(是否缺少强制转换?)
s1+=1;      //运行通过为什么会这样呢?有什么区别?

解决方案 »

  1.   

    哈哈 好问题 我个人的理解 s1=s1+1; 报错是因为1是int类型 所以和short相加的话自然是需要转换成同一类型的,
    至于 s1+=1;  这种写法会自动进行隐式转吧 (自动将1转化成了short)应该是C#语言的一种约定 或者是编译器?
      

  2.   

    s1+=1;正确的原因是Int16.operator+=运算符有一个版本可以接受int参数,
      

  3.   

    s1=s1+1;错误的原因,更准确的说s1+1不会有错,int和Int16相加之前,c#会把s1转化为int,也就是(int)S1+1,然后s1+1显然是int类型,把int类型赋值给S1类型就不匹配了,这才是真正错误的原因,提示是:无法将类型“int”隐式转换为“short”这说明因为int无法转化为short导致的错误,而正好是=赋值运算的时候需要把int转成short,因为s1+1是int类型,如果在s1+1的时候出错,应该提示的是无法将类型short转换为int,因为两个整数类型不匹配的时候,会把位数少的类型转化为位数多的类型,这样才不会有溢出,
      

  4.   

    表达式(s1 += 1)是复合赋值表达式,复合赋值表达式自动地将所执行计算的结果转型为其左侧变量的类型。如果结果的类型与该变量的类型相同,那么这个转型不会造成任何影响。然而,如果结果的类型比该变量的类型要宽,那么复合赋值操作符将悄悄地执行一个窄化原生类型转换
    s1+=1等效于   s1=(short)(s1+1),所以不会报错
      

  5.   

    当然,如果所加的整数很大如s1 = (short)(s1 + 9999999999999999),数据会溢出,s1结果为0
      

  6.   

    s1+=1 是自增,自增会自动转换类型的。
    s1=s1+1;是加法运算,不会自动转换为int类型,所以就错了。