错误原因:
"s1 = s1 + 1"中的数字1是整形的,而s1是短整形的,再由于此项目的警告等级设置的太低导致的错误的发生。你打开 项目属性 的 生成 标签,里面有个 警告等级 的项目,把它改的大一些就没有这个错误了。
"s1 = s1 + 1"中的数字1是整形的,而s1是短整形的,再由于此项目的警告等级设置的太低导致的错误的发生。你打开 项目属性 的 生成 标签,里面有个 警告等级 的项目,把它改的大一些就没有这个错误了。
解决方案 »
- 有没有其他方式可代替Properties.Settings来存储数据?
- 关于控件怎么设置默认值的问题
- c#怎么通过代码启动QQ
- C# windows 服务设置为’自动启动‘,但是在电脑启动的时候却没有启动,而手动是可以启动的,而且一切正常运行。
- 关于自定义控件与tabcontrol
- 各位都用过那些 winform 界面控件?
- 在MDI中如何让菜单根据子窗口进行变化?
- 怎么在数据库的一个表中插入一行数据
- 一分系列之C#问题之(未定义入口点?是什么错误啊?)
- C#怎样访问数据据库?请给一个精简的例子连接SQL SERVER数据库!还有ADO.NET又是什么?怎样使用?
- C#中根据学生成绩,怎样计算排名字段?
- 文件下载问题
s = (short)(s + 1);
需要从类型int转换为short.
我来回答:
1.s1=1和s1+=1的等号右侧是常数表达式,这时候,可以int32到int16的隐式转换;
2.另一个规则是:等号右侧的计算表达式默认推定为int32,哪怕是两个int16相加,
它不能够隐式转换为int16,s1=s1+1正好是这种情况
请楼主参见以下链接中关于"转换"的章节:
http://msdn.microsoft.com/zh-cn/library/ybs77ex4.aspx
不是这个原因,你试试看这段代码就知道了:
short s1 = 1;
short s2 = 1;
s1 = s1 + s2;
结果如下:
所以不管你是short+short 还是byte+short 最终都会被提升扩展成Int32 也就是int
也就是说s1+1最后是int型 但左边是s1是short型 2楼caozhy兄打的比喻很好 很明显一桶水倒到一杯水里会造成数据丢失 所以是错的
你必须要显示转换才可以s1 = (short)(s1 = 1);
2.s1+=1;为什么不报错
关于这个+=我以前也是一直认为和x=x+1是等效的 其实还是有区别的
最好的证据就是看反编译后的代码啦//Reflector反编译后
short s = 1;
s = (short) (s + 1);
没错 += 运算符最后会自动进行强制转换 所以不会报错 这是c#内部自己定义 你也无需纠缠了 知道就可以了
理由(个人理解。。自己也是瞎猜的)本身+=就是s=s+1的简写 s=s+1要显示转换 那就外面写个括号 s=(short)(s+1) 一看就知道是s+1被转换成short类型了
可是s+=1已经是简写了 我想显示转换这个(short)应该放那个位置呢 s+=(short)1 这明显是对1显示转换了肯定不对 那 s(short)+=1 擦 怎么看也不对啊
所以。。 C#就内部自动帮你转换了(擦 不知道哥这理解对不对 太会YY了)
哈哈 不对的地方请牛人指正哈 自动转换会存在一些风险 建议使用checked和unchecked
关键去控制 防止数据丢失