Decimal.Round()如何抛出OverflowException

Ami*_*atz 11 c# decimal overflowexception coreclr

我正在使用

Decimal.Round(decimal d)
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

有没有人知道什么输入可以抛出这个异常?

Cee*_* it 3

当我们进一步了解您已经发现的内容时,我们最终会实现VarDecRound函数。该函数只有一个返回错误代码的分支,即当其第二个参数cDecimals小于零时。此参数指示要舍入的小数位数:

if (cDecimals < 0) 
    return E_INVALIDARG; 
Run Code Online (Sandbox Code Playgroud)

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

正如 James Thorpe 在 OP 的评论中指出的那样,类似的断言是在调用链的更上游完成的,如下所示

if (decimals < 0 || decimals > 28) 
    FCThrowArgumentOutOfRangeVoid(...)
Run Code Online (Sandbox Code Playgroud)

结论:
执行无法达到导致抛出文档所示错误的程度OverflowException

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