【发布时间】:2017-02-20 15:41:18
【问题描述】:
我正在使用
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);
有人知道什么输入会引发此异常吗?
【问题讨论】:
-
FWIW,this is where 目标调用是在 .NET Core CLR 中实现的 - 你可以在第 188 行看到
OverflowException的抛出。 -
和this appears 是
VarDecRound的实现。乍一看,我不明白为什么它会向FCallRound返回失败结果(导致抛出异常)。它要么返回E_INVALIDARG,但其条件已经被FCallRound或NOERROR检查过,因此似乎OverflowException实际上不应该被抛出。 -
这永远不会发生。自动化功能的规范不是很好,它没有记录它可以返回什么样的故障代码。所以 CLR 作者只是假设,如果它失败了,那么它可能只是因为溢出。不会发生,Decimal.Min/MaxValue 是整数值。也可以从 Unix 版本的 VarDecRound 中看到:github.com/dotnet/coreclr/blob/master/src/palrt/…
-
@HansPassant:在 1990 年代,我的办公室就在写图书馆的人旁边,他们开玩笑地将文档(当时当然是纸上的)称为“谎言之书” .该文档确实不是很好,并且在过去 20 多年中显然没有人对其进行改进。
标签: c# decimal coreclr overflowexception