![](/img/trans.png)
[英]C#, Operator '??' cannot be applied to operands of type 'decimal' and 'decimal'
[英]c# Cannot convert anonymous type decimal? [] to decimal array
我已經實現了 ac# linq 表達式,它返回一個十進制可為空的數組。 我基本上需要將它傳遞給一個接受十進制數組的函數
我收到錯誤
無法轉換匿名類型十進制? [] 到十進制數組。
var benchMark1Returns = GetViewService<MV_INDEX_PERFORMANCE>()
.Where(x => x.IndexId == benchMark1 && x.PriceDate.Year == year)
.Select(x => new { x.Mtd}).ToArray();
var benchMark2Returns = GetViewService<MV_INDEX_PERFORMANCE>()
.Where(x => x.IndexId == benchMark2 && x.PriceDate.Year == year)
.Select(x => new { x.Mtd }).ToArray();
var compoundReturnsBenchMark1 = CompoundReturns(benchMark1Returns);
接受十進制數組的方法
public static decimal? CompoundReturns(decimal[] rtns)
{
if (rtns.Length == 0)
return null;
return rtns.Aggregate((decimal)1, (acc, val) => acc * (1 + val)) - 1;
}
首先,您不想要匿名類型的集合:
.Select(x => new { x.Mtd })
你只想要小數:
.Select(x => x.Mtd)
但此外,它還告訴你Mtd
是一個decimal?
,不是decimal
。 前者不能直接轉換為后者,因為前者支持后者不支持的值。 (即null
)
因此,當Mtd
為null
時,您需要定義一個默認值:
.Select(x => x.Mtd ?? 0M)
或更改您的方法以接受decimal?[]
:
public static decimal? CompoundReturns(decimal?[] rtns)
請注意,在最后一種情況下,您還需要更新您的方法以支持null
值。 例如,在Aggregate()
調用中更改案例1
的類型:
rtns.Aggregate((decimal?)1, (acc, val) => acc * (1 + val)) - 1;
當您調用new { x.Mtd }
,您是在指示編譯器創建一個新的匿名類型,該類型作為單個屬性,稱為Mtd
,其中包含十進制值。 當然,這不是decimal[]
,而是MyType[]
。
由於看起來您實際上並未將匿名類型用於任何內容,因此您應該簡單地返回十進制值本身,而不是匿名類型:
.Select(x => x.Mtd)
.Select(x => new { x.Mtd})
創建一個新的匿名對象。 您只需要屬性值:
.Select(x => x.Mtd)
如果Mtd
可以為 null 並且您希望過濾掉 null 值,請使用以下命令:
.Where(x => x.Mtd != null).Select(x => x.Mtd.Value).ToArray();
您必須進行兩項更改:
首先刪除匿名類型。 然后選擇
.Select( x=> x.Mtd ?? 0);
這將允許您在不更改當前方法的情況下將 decimal[] 作為參數傳遞。
否則,你必須這樣做:
.Select(x =x.Mtd)
並將方法參數更改為具有可為空的十進制數組。 希望沒事
除了我之前的評論,即
假設
x.Mtd
是decimal
,那么只需刪除new {}
即(x => x.Mtd).ToArray()
但更大的問題是您的數據庫中有空值,而實際上不應該 - 復合回報圖表中一段時間內的null
索引性能的后果對於復合回報將是災難性的 - 丟失的數據點會使所有未來的數據點無效。
所以真正的解決方案是在數據源中找到任何空數據點並為它們提供正確的數據。
然后將GetViewService
返回的GetViewService
上Mtd
的數據類型從
decimal? Mtd
到
decimal Mtd
(即不允許空值)。
那么您的原始代碼所需要做的就是刪除匿名類投影,即
.Where(x => x.Mtd != null)
.Select(x => x.Mtd.Value)
.ToArray();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.