我有一个Int32
,它在UInt16
的范围内。我应使用哪种方法将其更改为UInt16
?是否有理由使用一个而不是另一个?有什么陷阱(例如强制转换float
会截断,转换会舍入)?
Int32 int32 = 2;
UInt16 a = (UInt16)int32;
UInt16 b = Convert.ToUInt16(int32);
答案 0 :(得分:2)
Convert.ToUInt16(int)
的实现方式为:
public static ushort ToUInt16(int value)
{
if (value < 0 || value > 65535)
{
throw new OverflowException(Environment.GetResourceString("Overflow_UInt16"));
}
return (ushort)value;
}
如您所见,它只是在直接投射之前检查边界。因此,如果您知道您的整数在UInt16
的范围内,则只需进行强制转换并避免重复检查。
(我通过使用ILSpy获得了实现-免费)
答案 1 :(得分:2)
这里是Convert.ToUInt16(int value)
的{{3}}:
[CLSCompliant(false)]
public static ushort ToUInt16(int value) {
if (value < 0 || value > UInt16.MaxValue)
throw new OverflowException(Environment.GetResourceString("Overflow_UInt16"));
Contract.EndContractBlock();
return (ushort)value;
}
看起来它仍然可以转换为演员表。
答案 2 :(得分:0)
我认为区别在于,如果值超出目标类型的范围,则Convert将引发异常,而这种情况只会丢失信息。
Int32 a = Int32.MaxValue;
UInt16 b = (UInt16)a;
Console.WriteLine(b); // Outputs 65535
UInt16 c = Convert.ToUInt16(a); // Throws OverflowException
从效率角度来看,在LinqPad中检查IL,所生成代码的大小没有差异。将调用转换为类库方法,并且强制转换使用本机IL命令,因此如果安全性较低,则效率可能更高。