首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataTableExtensions.AsEnumerable()抛出InvalidCastException

DataTableExtensions.AsEnumerable()抛出InvalidCastException
EN

Stack Overflow用户
提问于 2013-11-27 03:50:12
回答 2查看 564关注 0票数 1

我正在使用DataTableExtensions.AsEnumerable方法创建一个列表。下面的代码将引发一个InvalidCastException:

代码语言:javascript
复制
SaleDiscount = (i.Field<decimal>("OnSalePercentAdjustment") * i.Field<decimal>("Price")), 

我不需要使用LINQ,只要再敲几下键,我就可以使用foreach循环处理数据表:

代码语言:javascript
复制
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是否比一些保存的击键带来任何好处。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-27 03:55:41

在一种情况下可以得到强制转换异常,而在另一种情况下没有异常,因为Convert.ToDecimal比简单的强制转换要宽松得多。强制转换异常表示基础字段不是decimal,但它具有可以轻松转换为decimal的类型。

若要在LINQ查询中使用Convert.ToDecimal,请按以下方式更改代码:

代码语言:javascript
复制
SaleDiscount = (
           Convert.ToDecimal(i.Field<object>("OnSalePercentAdjustment")) *
           Convert.ToDecimal(i.Field<object>("Price"))), 

或者,您可以找出正确的类型,使用Field<correct-type>(...)读取它,然后对decimal进行强制转换。

票数 0
EN

Stack Overflow用户

发布于 2013-11-27 03:59:40

这是因为您的一个列不是decimal

例如,它可能是int,甚至仍然是数字,您可以将int转换为decimal,因为.Field<T>逻辑看起来是这样的:

代码语言:javascript
复制
return (T)((object)value);

而且,因为您只能将值解压缩为它们被装箱的相同值:

代码语言:javascript
复制
int value = 3;
object boxedValue = value;

// works fine
int unboxedValue = (int)boxedValue;
// throws exception
double unboxedValueAsDouble = (double)boxedValue;

你去找InvalidCastExceptionConvert.ToDecimal看起来不一样:

代码语言:javascript
复制
return ((IConvertible)value).ToDecimal(null);

这就是为什么它能起作用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20233531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档