在我的构造函数中无法识别/解析十进制值

时间:2012-09-12 21:15:38

标签: c# parsing decimal nullable

我正在关注一个例子,它有一个类似这样的类:

public class Price
{

private decimal _sellingPrice;
private decimal _rrp;

public Price(decimal RRP, decimal SellingPrice)
{
            _rrp = RRP;
            _sellingPrice = SellingPrice;
}

}

然后使用LINQ:

从表中查询的值构造此类
var products = from p in new ShopDataContext().Products                           
                           select new Model.Product
                           {
                               Id = p.ProductId,
                               Name = p.ProductName,
                               Price = new Price(p.RRP, p.SellingPrice)
                           };

在示例中,这似乎有效,但是我收到此错误:

Price = new Price(p.RRP, p.SellingPrice)
The best overload method match has some invalid arguments
Argument 1: cannot convert from 'decimal?' to 'decimal' 

p.RRP和p.SellingPrice值从一个表中获取为System.Decimal类型,默认情况下显然可以为空,因此异常,在示例中这似乎运行正常,所以为什么呢?有什么我想念的吗?我正在尝试使用C#,默认情况下我知道它是一种严格的语言,所以没有选项可以关闭并让我的理解工作。

感谢您的见解。

2 个答案:

答案 0 :(得分:1)

问题是您的查询返回可为空的十进制类型而不是十进制类型。你需要修改你的构造函数:

public Price(decimal? RRP, decimal? SellingPrice) {
        _rrp = (decimal) RRP;
        _sellingPrice = (decimal) SellingPrice;
}

如果您想彻底检查可能的错误,可以use one of the techniques described in this article.

答案 1 :(得分:1)

在C#中decimal?无法隐式转换为decimal。因此,解决问题的唯一方法是进行显式转换。例如:

var products = from p in new ShopDataContext().Products                           
               select new Model.Product
               {
                   Id = p.ProductId,
                   Name = p.ProductName,
                   Price = new Price(
                        p.RRP ?? 0,
                        p.SellingPrice ?? 0)
               };