我在用

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

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

最佳答案

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

if (cDecimals < 0)
    return E_INVALIDARG;

(这种断言相当于.net中的ArgumentException
正如james thorpe在对op的评论中指出的,类似的断言是在调用链的更上层完成的,here
if (decimals < 0 || decimals > 28)
    FCThrowArgumentOutOfRangeVoid(...)

结论:
执行无法达到the point这将导致抛出OverflowException,如文档所述:
overflowexception似乎在内部被用作一种全部捕获机制,很像gdi中的outofmemoryexception+
文档与实际实现不匹配
overflowexception在概念上甚至没有意义。在同一数据类型中向上或向下舍入一个值不能超过integral min or max range,因为候选值本身必须在范围内(rounding method used

07-26 09:12