【问题标题】:Convert integer to byte but do not overflow将整数转换为字节但不溢出
【发布时间】:2014-11-05 01:08:57
【问题描述】:

如何在 C# 中将整数值转换/转换为字节值,但不回绕或抛出异常?我正在寻找的是某种bool byte.TryConvert(int i, out b) 方法。

我尝试了Convert.ToByte 和直接转换。

byte b = Convert.ToByte(257); // throws OverflowException
byte b = (byte)257; // results in 1
byte b = (byte)(-1); // results in 255

或者我是否必须将字节“反向转换”(因为没有更好的词)到 int 并将其与原始值进行比较?

【问题讨论】:

  • 也许是个愚蠢的问题,但是是什么阻止了您在进行强制转换之前检查您的 int 是否大于 255?
  • 您的预期结果是什么? (当然,从 256(预编辑)转换的结果是 0,而不是 1?)
  • @MarcGravell:预期结果是null(对于我的用例)。如果转换/转换成功则返回 true 并且转换失败则返回 false 的方法是最好的(如果 .NET 框架中已经存在这样的函数)。
  • 从您的问题来看,如果整数超出 0 - 255 范围,您想要的结果并不明显。
  • @knittl null 不是byte 的有效值,因此您不能这样做;你需要使用byte? 或类似的

标签: c# .net casting integer byte


【解决方案1】:

自己编写方法。检查 int 的值。如果它在范围内,则返回 true 并通过直接转换将其分配给 out 参数。如果不是,则返回 false,将 out 参数设置为零。

投反对票的请发表评论。

编辑这是我的解决方案;与 Marc Gravell 的不同,它没有引入可空性:

public bool TryToByte(int value, out byte result)
{
    var success = value >= byte.MinValue && value <= byte.MaxValue;
    result = (byte)(success ? value : 0);
    return success;
}

【讨论】:

  • @Alex 我没有提供示例,因为在我看来这有点像“请为我编写代码”的问题。
  • 啊,更多的反对票。我现在添加了我写这个答案时想到的方法。
【解决方案2】:

在我的具体用例中,我实际上有一个可为空的字节类型。 ... 有没有bool byte.TryConvert(int i, out b)这样的方法?

没有。您必须执行以下操作:

byte? result = (value >= byte.MinValue && value <= byte.MaxValue)
             ? (byte)value : (byte?)null;

【讨论】:

  • "有没有bool byte.TryConvert(int i, out b)这样的方法?" - 现在有。 :-)
  • 看起来不错(不像我的解决方案那样做作),谢谢! :) 为什么将值转换为字节而不是可为空的字节? ? (byte?)value : null? (byte)value : (byte?)null 之间有区别吗?我知道当涉及可空的原始类型时,.NET 有时会生成奇怪(效率低下)的 IL 代码。
  • 是的,刚刚使用 LINQPad 验证了两次转换将导致比单次转换为 byte? 的版本更少的 IL 指令
猜你喜欢
  • 2013-09-27
  • 1970-01-01
  • 2012-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多