在C#中转换为Int会将值保留为0

在C#中转换为Int会将值保留为0,c#,parsing,int,C#,Parsing,Int,我在试着转换十进制?将结果输入并存储在“DayOffset”中。但由于某种原因,“DayOffset”的值在我运行代码时被设置为0。在NumberArrangeHigh中传递的值为4 这就是我的代码的样子: int DayOffset: try { parseSuccess = int.TryParse(numberRangeHigh.ToString(), out DayOffset); } catch (Exception ex) { _foundationService.L

我在试着转换十进制?将结果输入并存储在“DayOffset”中。但由于某种原因,“DayOffset”的值在我运行代码时被设置为0。在NumberArrangeHigh中传递的值为4

这就是我的代码的样子:

int DayOffset:
try
{
    parseSuccess = int.TryParse(numberRangeHigh.ToString(), out DayOffset);
}
catch (Exception ex)
{
    _foundationService.LogBusinessError(null, new ParameterBuilder(), ex.Message.Replace(" ", "_"));
    return false;
}

为什么要转换成字符串呢?要将
decimal?
转换为
int
,只需使用强制转换:

int dayOffset = 0;
if (numberRangeHigh != null)
    dayOffset = (int)numberRangeHigh.Value;
上面的代码将截断十进制数,因此4.7将变为4。如果要舍入,请改用
Convert.ToInt32

 dayOffset = Convert.ToInt32(numberRangeHigh.Value);
作为旁注,使用
TryParse
的正确方法如下:

int DayOffset:
if (!int.TryParse(numberRangeHigh.ToString(), out DayOffset))
{
    // Handle error...
    return false;
}

假设NumberArrangeHigh是Decimal类型,请尝试以下操作:

int DayOffset = Decimal.ToInt32(numberRangeHigh);
对于任何可为null的结构(您提到它是一个
十进制?
),通常最好先检查
.HasValue
属性(如果它为null)。你可以这样做:

int dayOffset = (numberRangeHigh.HasValue) ? Convert.ToInt32(numberRangeHigh.Value) : 0;

如果解析失败,
TryParse
不会抛出异常-它只是没有填充
out
参数。在这种情况下,这意味着
DayOffset
保留默认值0。请参阅本文:在调试器中运行代码将向您展示@BJMyers通过查看您的代码所了解的内容。学习使用调试器会让你的眼睛变得更像BJMeyers。当我试图用这种方式解析
4
decimal?
值时,
DayOffset
中的值会像预期的那样结束
4
。将值转换为字符串并对其进行分析是一种奇怪的方法,它只支持没有小数部分的值,但它确实适用于给定的情况。谢谢,我会尝试删除将值转换为字符串的部分。我甚至不需要那个。