首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(UInt16)i对Convert.ToUInt16(i)

(UInt16)i对Convert.ToUInt16(i)
EN

Stack Overflow用户
提问于 2018-07-05 19:55:02
回答 3查看 492关注 0票数 1

我有一个Int32 ,它在UInt16的边界内。我应该使用哪种方法将其转换为UInt16?是否有理由使用其中一种而不是另一种,还是这不重要?任何陷阱(例如,铸造一个float将截断,转换将圆圆)?

代码语言:javascript
复制
Int32 int32 = 2;
UInt16 a = (UInt16)int32;
UInt16 b = Convert.ToUInt16(int32);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-05 20:00:43

下面是全源 for Convert.ToUInt16(int value)

代码语言:javascript
复制
    [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
EN

Stack Overflow用户

发布于 2018-07-05 19:59:59

Convert.ToUInt16(int)被实现为:

代码语言:javascript
复制
public static ushort ToUInt16(int value)
{
    if (value < 0 || value > 65535)
    {
        throw new OverflowException(Environment.GetResourceString("Overflow_UInt16"));
    }
    return (ushort)value;
}

正如您所看到的,它只是在直接转换之前检查边界。因此,如果您知道您的整数在UInt16的范围内,那么只需强制转换并避免冗余检查。

(我是通过使用ILSpy - its免费实现的)

票数 2
EN

Stack Overflow用户

发布于 2018-07-06 09:34:56

我认为不同之处在于,如果值超出目标类型的范围,则转换将抛出异常,而大小写只会丢失信息。

代码语言:javascript
复制
Int32 a = Int32.MaxValue;
UInt16 b = (UInt16)a;
Console.WriteLine(b); // Outputs 65535
UInt16 c = Convert.ToUInt16(a); // Throws OverflowException

就效率而言,在LinqPad中检查IL时,生成的代码大小没有差别。将调用转换到类库方法,而强制转换使用本机IL命令,因此,如果安全性较低,则效率可能更高。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51198948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档