Decimal.Round()如何抛出OverflowException

时间:2017-02-20 15:41:19

标签: c# decimal coreclr overflowexception

我正在使用

Decimal.Round(decimal d)

MSDN表示它可以抛出OverflowException https://msdn.microsoft.com/en-us/library/k4e2bye2(v=vs.110).aspx

我不确定如何发生这种情况。我尝试使用ilSpy查看实现 直到外部实现:

// decimal
[SecurityCritical]
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void FCallRound(ref decimal d, int decimals);

是否有人知道哪些输入会引发此异常?

1 个答案:

答案 0 :(得分:3)

当我们从你已经发现的东西走得更远时,我们最终会实现VarDecRound功能。此函数只有一个分支,它返回错误代码,即第二个参数cDecimals小于零时。此参数指示要舍入的小数位数:

if (cDecimals < 0) 
    return E_INVALIDARG; 

(这种断言相当于ArgumentException在.NET中的含义)

正如James Thorpe在对OP的评论中指出的那样,在调用链here上进一步做出了类似的断言:

if (decimals < 0 || decimals > 28) 
    FCThrowArgumentOutOfRangeVoid(...)

结论:
执行无法达到导致OverflowException抛出的the point:{/ p>

  1. OverflowException似乎已在内部用作catch-all机制,非常类似于GDI +中的OutOfMemoryException
  2. 文档与实际实施不符合
  3. OverflowException在概念上甚至没有意义。在相同数据类型中向上或向下舍入值不能超过integral min or max range,因为候选值本身必须在范围内(rounding method used