我有一个Int32 ,它在UInt16的边界内。我应该使用哪种方法将其转换为UInt16?是否有理由使用其中一种而不是另一种,还是这不重要?任何陷阱(例如,铸造一个float将截断,转换将圆圆)?
Int32 int32 = 2;
UInt16 a = (UInt16)int32;
UInt16 b = Convert.ToUInt16(int32);发布于 2018-07-05 20:00:43
下面是全源 for Convert.ToUInt16(int value):
[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;
}看来它还是决定给演员看了。
发布于 2018-07-05 19:59:59
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 - its免费实现的)
发布于 2018-07-06 09:34:56
我认为不同之处在于,如果值超出目标类型的范围,则转换将抛出异常,而大小写只会丢失信息。
Int32 a = Int32.MaxValue;
UInt16 b = (UInt16)a;
Console.WriteLine(b); // Outputs 65535
UInt16 c = Convert.ToUInt16(a); // Throws OverflowException就效率而言,在LinqPad中检查IL时,生成的代码大小没有差别。将调用转换到类库方法,而强制转换使用本机IL命令,因此,如果安全性较低,则效率可能更高。
https://stackoverflow.com/questions/51198948
复制相似问题