11

我在用着

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);

有人知道什么输入会引发此异常吗?

4

1 回答 1

3

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

if (cDecimals < 0) 
    return E_INVALIDARG; 

(这种断言相当于ArgumentException.NET 中的 an)

正如詹姆斯索普在对 OP 的评论中指出的那样,类似的断言在调用链的上游完成,这里

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

结论:
执行无法达到导致抛出记录的点OverflowException

  1. OverflowException 似乎在内部被用作包罗万象的机制,很像 GDI+ 中的 OutOfMemoryException
  2. 文档与实际实现不符
  3. OverflowException 在概念上甚至没有意义。在同一数据类型中向上或向下舍入一个值不可能超过整数最小或最大范围,因为候选值本身必须在范围内(使用舍入方法
于 2017-12-15T18:41:43.277 回答