<<C#入门经典>>上面说,C#工程的Build选项的”高级”选项卡里面,有一个单选框叫做
“Check for arithmetic overflow/underflow”。这个勾选以后checked(类型)变量)会有运行时的溢出检查
“Check for arithmetic overflow/underflow”。这个勾选以后checked(类型)变量)会有运行时的溢出检查
short s = 3333; byte b1 = (byte)s; byte b2 = Convert.ToByte(s);//和checked((类型)变量)强制类型转换的本质区别是什么?
也就是说,b1在赋值的时候,会有溢出检查。这个效果和b2这一行相同。
那么本人的问题是:
(1) 都是溢出检查,checked((byte)s)和Convert.ToByte(s)是完全一样的行为吗,还是稍有不同?
(2) 是不是说,编译器会根据本人能否勾选了溢出检查,来决定checked(())是什么都不做,还是内部调用Convert.ToByte? 显示转换和Convert.ToXXX之间到底有什么关系呢?
还请指点!
解决方案
40
(1) 都是溢出检查,checked((byte)s)和Convert.ToByte(s)是完全一样的行为吗,还是稍有不同
目前她们的行为是一样的,但是
checked((byte)s)的行为是由C#语言规范定义的,例如DotNet和Mono的结果都应该是一样的。
而Convert.ToByte则是函数实现,它的行为要看函数的说明书和具体内部实现。甚至将来的dotnet版本,都可能引入差别。
(2) 是不是说,编译器会根据本人能否勾选了溢出检查,来决定checked(())是什么都不做,…
假如你在代码里显式的调用checked,那么它将优先于“能否勾选了溢出检查”。
(举个例子,你勾选了溢出检查,代码 byte b1 = unchecked((byte)s);也不会抛出异常)
目前她们的行为是一样的,但是
checked((byte)s)的行为是由C#语言规范定义的,例如DotNet和Mono的结果都应该是一样的。
而Convert.ToByte则是函数实现,它的行为要看函数的说明书和具体内部实现。甚至将来的dotnet版本,都可能引入差别。
(2) 是不是说,编译器会根据本人能否勾选了溢出检查,来决定checked(())是什么都不做,…
假如你在代码里显式的调用checked,那么它将优先于“能否勾选了溢出检查”。
(举个例子,你勾选了溢出检查,代码 byte b1 = unchecked((byte)s);也不会抛出异常)