1

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

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#,并且默认情况下我知道它是一种严格的语言,因此没有选项可以关闭并使其在我的理解中起作用。

感谢您的见解。

4

2 回答 2

1

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

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

如果您想彻底检查可能的错误,您可以使用本文中描述的技术之一。

于 2012-09-12T21:22:15.707 回答
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)
               };
于 2012-09-12T21:24:34.327 回答