2010-08-19 50 views
0

爲什麼不是下面的代碼工作?我收到以下錯誤。執行Ienumerable時發生錯誤<Datarow> .Sum()方法。

無法將類型'V'隱式轉換爲int。

private ObservableCollection<DataItem> method<T, V>(DataTable dt, SeriesItem seriesItem, FilterValues filter, ObservableCollection<DataItem> chart) 
{ 
    var result = from t in dt.AsEnumerable() 
       group t by new { type = t.Field<T>(seriesItem.LabelMapping).ToString().ToUpper() } into g 
       orderby g.Key.type 
       select new 
       { 
        Item_Type = g.Key.type.ToString(), 
        Amount = seriesItem.IsSum 
          ? g.Sum(s => s.Field<V>(seriesItem.ValueMapping)) 
          : g.Count() 
       }; 

    foreach (var g in result) 
    { 
     chart.Add(new DataItem(g.Item_Type, double.Parse(g.Amount.ToString())) 
        { 
         IsSum = seriesItem.IsSum, 
         IsDisplayCurrency = seriesItem.IsDisplayCurrency 
        }); 
    } 
    return chart; 
} 
+0

Wha是'seriesItem.ValueMapping'的類型嗎? Forthat問題,也許你可以粘貼SeriesItem的基本公共定義? – 2010-08-19 12:14:19

+0

不會工作...這不是C++模板。 – leppie 2010-08-19 12:28:48

回答

0

g.Count()返回一個int

IsSum ? g.Sum() : g.Count()必須是int

所以g.Sum()必須是int

所以V必須是int

沒有什麼(除此扣除外)停止V從decimal或其他任何東西,因此編譯器錯誤消息。

要解決:任何這些:

  • 刪除V並獲得INT結果
  • 刪除g.Count()
  • 投g.Count()將翻一番,解決五世的類型爲雙。

這最後一個有一個額外的好處,即您可以稍後在方法中刪除雙重轉換代碼。


@Daniel倫肖

List<decimal> source = new List<decimal>(); 
int result = source.Sum<decimal>(); //compile error 
    //Cannot implicitly convert type 'decimal' to 'int' 
+0

'g.Sum()'可以返回任何可以隱式轉換爲int或可以隱式轉換爲int的類型 – 2010-08-19 12:26:48

0

的問題是,你要

s.Field<V>(...)將返回V型的值類型V的所有值求和,因此選擇匿名函數s => s.Field<V>(...)也返回類型V的值。但是,g.Sum(...)需要一個選擇器函數,它返回以下類型之一的值:decimal,double,float,int,long(或它們的可空對象)。從V類型隱式轉換到任何這些類型是不可能的。

如果該值映射列是一種特殊類型的總是然後使用該類型明確,而不是通用型五

0

看你的代碼,我想這段代碼返回V型的價值:

s => s.Field<V>(seriesItem.ValueMapping) 

,如果是這樣的話,因爲有一個在V型沒有限制(它可以是任何東西,對象,字符串,等等,等等),編譯器將無法找出其中重載Enumerable.Sum()方法來調用,因此編譯器錯誤。假設只有在運行時才知道V的類型(所以你不能簡單地將V約束爲int/decimal/double等),那麼如何將委託添加到可用於從對象返回int的方法V型?即G:

private ObservableCollection<DataItem> method<T, V>(DataTable dt, SeriesItem seriesItem, FilterValues filter, ObservableCollection<DataItem> chart, Func<V, int> convertV) 
    { 
     var result = from t in dt.AsEnumerable() 
        group t by new { type = t.Field<T>(seriesItem.LabelMapping).ToString().ToUpper() } into g 
        orderby g.Key.type 
        select new 
        { 
         Item_Type = g.Key.type.ToString(), 
         Amount = seriesItem.IsSum ? g.Sum(s => convertV(s.Field<V>(seriesItem.ValueMapping))) : g.Count() 
        }; 

然後你把責任推給調用者(這也不會知道這個類型的T和V)弄清楚如何到V轉換爲int。

相關問題