Tag: overflowexception

数组创建表达式和长尺寸长度

我只是阅读C#规范和数组创建表达式的部分。 在规范中它说: array-creation-expression: new non-array-type [ expression-list ] rank-specifiersopt array-initializeropt new array-type array-initializer new rank-specifier array-initializer [剪断] 表达式列表的维度长度表达式按从左到右的顺序进行计算。 在评估每个表达式之后,执行对以下类型之一的隐式转换(第6.1节):int,uint,long,ulong。 选择此列表中存在隐式转换的第一种类型。 如果对表达式的计算或后续的隐式转换导致exception,则不会评估其他表达式,也不会执行其他步骤。 兴奋,我想嗯我不认为我已经看到了,让我们尝试一个很长的尺寸: bool[] bb = new bool[2L + Int32.MaxValue]; bb[int.MaxValue + 1L] = true; Visual Studio在指向第一行时说: 未处理的exception:System.OverflowException:算术运算导致溢出。 请注意,这不是“OutOfMemoryException”。 如果我更改我的数组创建表达式并使其更小: bool[] bb = new bool[Int32.MaxValue]; 这次我得到一个“OutOfMemoryException”。 我知道CLR的整个“没有对象可以大于2GB”的限制。 我的问题是,当长度不再可以转换为Int32时,为什么我会得到一个非常不同的exception(OverflowException vs OutOfMemoryException)?

使用负数组大小抛出OverflowException背后的基本原理?

编写完可以归结为以下内容的代码后: var size=-1; var arr=new byte[size]; 我很惊讶它抛出了一个OverflowException 。 OverflowException状态的文档: 在已检查上下文中的算术,转换或转换操作导致溢出时引发的exception。 我无法看到为这个exception提供的描述如何提供负的大小和数组长度,所以深入研究并发现这确实是指定的行为: 尺寸长度的计算值validation如下。 如果一个或多个值小于零,则抛出System.OverflowException,并且不执行进一步的步骤。 我想知道为什么选择了OverflowException。 如果你问我,那就太误导了。 我花了至少5分钟的调查时间(不计算我的思考)。 任何人都可以(根据我的想法)对这个特殊的设计决定有所了解吗?

SQLCLR项目中的SqlDecimal问题

使用SqlDecimals时,我有一些意想不到的结果。 最后,当划分2个SqlDecimal时,似乎可以归结为缩放问题。 c#示例代码如下所示: [Microsoft.SqlServer.Server.SqlFunction] [return: SqlFacet(Precision = 38, Scale = 8)] public static SqlDecimal fn_divide([SqlFacet(Precision = 38, Scale = 8)]SqlDecimal x, [SqlFacet(Precision = 38, Scale = 8)]SqlDecimal y) { var r = SqlDecimal.Divide(@x, @y); return r; } SQL测试代码如下所示: DECLARE @x numeric(38, 8), @y numeric(38, 8) SELECT @x = Replicate(‘1’, 28) + ‘.12345678’, @y = ‘0.25896314’ […]

算术运算导致溢出。 (添加整数)

我无法理解这个错误: 在对方法SetVolume的调用中, Volume = 2055786000, size = 93552000.Volume是Integer属性,size也是Integer,如您所见。 该类是dbml实体类的部分类,但是此Volume属性不是数据库中的列,它仅作为“业务对象属性”存在于部分类中。 查看详情显示: Data> Item :为了评估索引属性,必须限定属性,并且必须由用户显式提供参数。 什么可能导致这个…?

Oracle编号为C#decimal

我知道在互联网上有几个关于这个问题的post和post,我已经阅读过它们(不是每篇文章,我都要承认)但是没有一个能完全满足我。 我的情况: 我正在使用ODP.net(dll版本2.111.6.0)访问Oracle DB(版本10 + 11)和DataReader来检索数据(.NET 3.5,C#)。 使用此代码会导致’ System.OverflowException(算术运算导致溢出) 。 decimal.TryParse(oraReader.GetOracleDecimal(0).Value.ToString(), NumberStyles.Any, null, out parsedOraDecimal) 这一个导致值为’ 3,0000000000000000000000000000000000000000000000000000000000000E-126 ‘ decimal.TryParse(oraReader.GetOracleValue(0).ToString(), NumberStyles.Any, null, out parsedOraDecimal) 现在我必须找到一些方法来正确检索和评估这个值 – 数据库也可以从我无法控制的其他应用程序中使用,因此无法进行更改。 将我的C#代码中的类型从’decimal’转换为’double’也不是一个真正的选择。 有任何想法吗?