c#cast错误(infinte值....什么?)

lem*_*unk 5 c# casting dataset winforms

问题我可以忽视,但这个问题让我非常恼火.我试图从数据集中获取一个值,然后用它来做一些计算.在数据集中它被视为一个对象,所以我需要将它转换为int或double.由于某种原因,我得到了一个让我紧张的愚蠢错误.继承人的代码.

private void SpendsAnalysis()
    {
        float tempQty = 0;
        float tempPrice = 0;
        double tempTot = 0;
        double total = 0;

        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            tempQty = (float)row.Cells["Qty"].Value;
            tempPrice = (float)row.Cells["Unit"].Value;

            tempTot = tempQty * tempPrice;
            total += tempTot;
        }

        textBox7.Text = total.ToString();
    }
Run Code Online (Sandbox Code Playgroud)

抛出:"指定的演员阵容无效." (System.InvalidCastException)在转换表单时,必须小于inifnite.这是我得到的恼人错误.现在我从我的数据集中获取数据,该数据集从存储过程中获取数据.我相信"数量"字段类型是货币(是的,为什么数量货币哈哈,而不是我的表!).在我的datagrid视图中它看起来像1.000,这是由于类型转换?我该怎么纠正这个?提前谢谢了!

ang*_*son 9

类型转换必须成功,并且不幸的是,直接从object一个不同于底层对象的类型转换是不可行的,即使从decimal(.NET类型currency)转换为a float通常也可以工作.

如果数据库中的类型是currency,我会尝试这样做:

= (float)(decimal)row.Cells["Qty"].Value;
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用:

= Convert.ToSingle(row.Cells["Qty"].Value);
Run Code Online (Sandbox Code Playgroud)

这将查看实际值并找出要执行的正确转换类型.

要回答您的评论,上面的表达式涉及两个不同的转换:

  • 取消装箱转换object为值类型,在本例中为adecimal
  • 显式转换decimalfloat

第一个是拆箱转换,记录在C#语言规范第4.3.2节(这是C#4.0规范)中:

对非可空值类型的取消装箱操作包括首先检查对象实例是否为给定的非可空值类型的盒装值,然后将该值复制出实例.

(我的重点)

我也有规范的注释版本,Eric Lippert总结为:

虽然将unboxed int转换为unboxed double是合法的,但将盒装int转换为unboxed double-only转换为unboxed int是不合法的.

第二个是显式转换,记录在C#语言规范部分6.2.1中:

6.2.1显式数字转换
显式数字转换是从数字类型到另一个数字类型的转换,其中隐式数字转换(第6.1.2节)尚不存在:
...
decimal到sbyte,byte, short,ushort,int,uint,long,ulong,char,float或double.

(再一次,我的重点)

总结一下:

  • 当从object一个值类型"转换" 到一个值类型时,您实际上是打开了盒装值,并且首先必须将实际的基础值拆分为正确的类型,然后才能将其转换为其他类型.

  • 说完我想在答案中说的所有内容,你确定你想要*它作为一个`浮动`而不是一个`十进制`? (3认同)