Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将整数转换为字节,但不溢出_C#_.net_Casting_Integer_Byte - Fatal编程技术网

C# 将整数转换为字节,但不溢出

C# 将整数转换为字节,但不溢出,c#,.net,casting,integer,byte,C#,.net,Casting,Integer,Byte,如何在C#中将整数值转换/强制转换为字节值,但不环绕或引发异常?我要找的是某种bool byte.TryConvert(inti,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 或者我必须将字节“反向转换”(因

如何在C#中将整数值转换/强制转换为字节值,但不环绕或引发异常?我要找的是某种
bool byte.TryConvert(inti,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的值。如果它在范围内,则返回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;
}
public bool TryToByte(int值,out字节结果)
{
var success=value>=byte.MinValue&&value
在我的具体用例中,我实际上有一个可为空的字节类型。
...

有没有像boolbyte.TryConvert(inti,out b)这样的方法

不,您必须执行以下操作:

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

byte?result=(value>=byte.MinValue&&value)也许是个愚蠢的问题,但是什么阻止你在进行转换之前检查int是否大于255?你的预期结果是什么?(当然,从256(预编辑)转换的结果是0,而不是1?@marcGravel:预期结果是
null
(对于我的用例)。如果转换/转换成功,则返回true;如果转换失败,则返回false的方法最好(如果.NET framework中已存在此函数)。从您的问题来看,当整数超出0-255范围时,您希望得到什么结果并不明显。@knittl
null
不是
byte
的有效值,因此您不能这样做;您需要使用
byte?
或类似的方法“是否有bool byte.TryConvert(int i,out b)这样的方法?”-现在有::-)看起来不错(不像我的解决方案那么做作),谢谢!:)为什么将值强制转换为字节而不是可为空的字节?值
?(字节?)null
?(字节)value:(字节?)null
?我知道.NET有时会生成奇怪的(低效的)涉及可空基元类型时的IL代码。是的,刚刚用LINQPad验证过,两次强制转换将导致比单个强制转换为
字节的版本更少的IL指令?
@Alex我没有包括一个示例,因为我觉得这有点“请为我编写代码”问题。啊,更多的反对票。我现在加入了我在写这个答案时想到的方法。