2012-09-12 24 views
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.Selling價值是從一個表作爲System.Decimal類型,默認情況下顯然是可空的,因此例外,在這個例子中,這似乎運行正常,所以爲什麼?有什麼我失蹤?我正在嘗試使用C#,並且我知道它默認使用嚴格的語言,所以沒有選項可以關閉並根據我的理解進行操作。

謝謝你的洞察力。

回答

1

問題是您的查詢正在返回一個可爲空的十進制類型而不是十進制類型。您需要修改你的構造是這樣的:

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

如果你想在檢查可能存在的錯誤徹底,你可以use one of the techniques described in this article.

+0

你好彼得,我注意到過,需要這種變化,使看來,筆者錯過了構造可空小數類型,我如果有另一種方式來度過,即使沒有這樣做的工作只是想知道因爲它似乎對他很好。 – CoderRoller

+0

作者可能使用了非空數據庫字段?沒有更多信息,它如何運作尚不清楚。 –

+0

字段RRP和SellingPrice在我的表上設置爲NULL,因此它們被作爲十進制取出?在LINQ查詢中,作者在代碼示例(我剛剛發現)上將它們設置爲非空:)。無論如何,我可以用空值或非空值解決問題。這兩個答案都是正確的,但是我會給你,因爲你指出了額外的細節。感謝你們。 – CoderRoller

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) 
       }; 
+0

或'p.RRP? 0' –

+0

@BobVale,謝謝,仍然沒有習慣這個很好的語法。更新了帖子! – Andrei

+0

喜BobVale和安德烈,安德烈什麼建議: 價格=新價格( p.RRP.HasValue p.RRP.Value:??0, p.SellingPrice.HasValue p.SellingPrice.Value:0 ) 作品太。感謝你們。似乎作者錯過了轉換。 – CoderRoller