Попробуйте использовать
T sum = default(T);
Также имеет смысл ограничение общего типа, если вы используете только типы значений, например,
where T : struct
Кроме того, вы передали p => p.Weight
как Func<T, T> getValue
, это неверно, вы должны объявить дополнительный универсальный параметр для возвращаемого значения для Func
, в настоящее время вы принимаете и возвращаете тот же тип
Наконец, я заставляю ваш фрагмент работать, добавляя дополнительныйуниверсальный параметр и сделав sum
как dynamic
public class Program
{
static void Main(string[] args)
{
var listProducts = new List<Product<int>> {
new Product<int>{ Weight = 1},
new Product<int> { Weight = 2},
new Product<int> { Weight = 87}
};
var calc2 = new Calculator<Product<int>, int>();
var averageWeight = calc2.Average(listProducts, p => p.Weight);
Console.WriteLine($"Average weight is: {averageWeight}");
}
}
public class Calculator<T, S> where S : struct
{
public S Average(List<T> items, Func<T, S> getValue)
{
dynamic sum = default(S);
foreach (var item in items)
{
var result= getValue(item);
sum += result;
}
return (S)Convert.ChangeType(sum / items.Count, typeof(S));
}
}
В вашем фрагменте Product<int>
в качестве параметра универсального типа для Calculator
и int
является параметром универсального типа для Product,T>
, вы можете 'использовать оба из них как один параметр в getValue
и возвращать обратно из Average