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 型として取得され、デフォルトで null 可能であるように見えるため、例外が発生します。不足しているものはありますか? 私はC#を試していますが、デフォルトで厳密な言語であることを知っているので、オフにしてこれを機能させるオプションはありません。

あなたの洞察に感謝します。

4

2 に答える 2

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 に答える
1

問題は、クエリが 10 進数型ではなく、null 許容の 10 進数型を返していることです。次のようにコンストラクタを変更する必要があります。

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

考えられるエラーを徹底的にチェックしたい場合は、この記事で説明されている手法のいずれかを使用できます。

于 2012-09-12T21:22:15.707 に答える