我正在使用DataTableExtensions.AsEnumerable方法创建一个列表。下面的代码将引发一个InvalidCastException:
SaleDiscount = (i.Field<decimal>("OnSalePercentAdjustment") * i.Field<decimal>("Price")), 我不需要使用LINQ,只要再敲几下键,我就可以使用foreach循环处理数据表:
i.Price = Convert.ToDecimal(row["Price"]);
var saleDiscount = Convert.ToDecimal(row["SaleDiscount "]);
i.SalePrice = i.Price - (i.Price * saleDiscount );
i.SaleDiscount = i.Price - i.SalePrice;只是好奇,我怎么才能修好LINQ?并且想知道在这里使用LINQ是否比一些保存的击键带来任何好处。
发布于 2013-11-27 03:55:41
在一种情况下可以得到强制转换异常,而在另一种情况下没有异常,因为Convert.ToDecimal比简单的强制转换要宽松得多。强制转换异常表示基础字段不是decimal,但它具有可以轻松转换为decimal的类型。
若要在LINQ查询中使用Convert.ToDecimal,请按以下方式更改代码:
SaleDiscount = (
Convert.ToDecimal(i.Field<object>("OnSalePercentAdjustment")) *
Convert.ToDecimal(i.Field<object>("Price"))), 或者,您可以找出正确的类型,使用Field<correct-type>(...)读取它,然后对decimal进行强制转换。
发布于 2013-11-27 03:59:40
这是因为您的一个列不是decimal。
例如,它可能是int,甚至仍然是数字,您可以将int转换为decimal,因为.Field<T>逻辑看起来是这样的:
return (T)((object)value);而且,因为您只能将值解压缩为它们被装箱的相同值:
int value = 3;
object boxedValue = value;
// works fine
int unboxedValue = (int)boxedValue;
// throws exception
double unboxedValueAsDouble = (double)boxedValue;你去找InvalidCastException。Convert.ToDecimal看起来不一样:
return ((IConvertible)value).ToDecimal(null);这就是为什么它能起作用。
https://stackoverflow.com/questions/20233531
复制相似问题