我在用
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)