2010-08-07 22 views
0

我的代碼很簡單:使用泛型與Func鍵作爲參數

public override C Calculator<C>(Team[] teams, Func<Team, C> calculatorFunc) 
    { 
     return teams.Average(calculatorFunc); 
    }  

我得到這個錯誤:

錯誤2方法「System.Linq.Enumerable.Average類型參數(System.Collections中.Generic.IEnumerable,System.Func)'不能從使用情況中推斷出來。嘗試明確指定類型參數。

我該如何解決這個問題?

回答

1

你不能 - 至少在目前的形式。沒有可用於完全通用值的Average過載(即,您指定的所有類型爲C)。

平均需求數字清單(int,double,float ...)或產生數字的轉換函數。在目前的格式中,您可以撥打Calculator<string>,這對計算字符串的平均值毫無意義。

您只需要將方法限制爲特定的數字類型(或提供重載),但泛型根本無法工作。

0

而是寫的:

Calculate(team, calcFunc); 

你將不得不寫:

Calculate<MyClass>(team, calcFunc); 

但是,你真的應該知道什麼是calculatorFunc返回---我要去假設所有的你使用的返回相同的值類型(無論是十進制還是浮點數)。在這種情況下,你可以將其定義爲:

public override int Calculator(Team[] teams, Func<Team, int> calculatorFunc) 
{ 
    return teams.Average(calculatorFunc); 
} 

然後你在聲明中沒有任何泛型可以擔心。

+0

號這是關於方法的定義,沒有與問題稱它。 – Dario 2010-08-07 18:39:14

+0

你是什麼意思「計算」? (它的計算器......) 你能否根據需要寫出整個方法來寫? – 2010-08-07 18:39:31

1

Enumerable.Average方法不具有對泛型類型起作用的重載。您正試圖撥打Average<TSource>(IEnumerable<TSource>, Func<TSource, C>),這不存在。

爲了使用平均,你需要指定類型之一(C)實際存在的,如doubledecimal