2010-08-19 21 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。

相关问题