(UInt16)i与Convert.ToUInt16(i)

时间:2018-07-05 19:55:02

标签: c# .net

我有一个Int32 ,它在UInt16的范围内。我应使用哪种方法将其更改为UInt16?是否有理由使用一个而不是另一个?有什么陷阱(例如强制转换float会截断,转换会舍入)?

Int32 int32 = 2;
UInt16 a = (UInt16)int32;
UInt16 b = Convert.ToUInt16(int32);

3 个答案:

答案 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命令,因此如果安全性较低,则效率可能更高。