2010-05-11 2 views
3
static void Main() 
     { 
string[] a = { "a", "asd", "bdfsd", "we" }; 
      a = a.OrderBy(fun).ToArray(); 
} 

private static int fun(string s) 
     { 
      return s.Length; 
     } 

его дает ошибку времени компиляции. Я знаю, что мы можем сделать это с помощью выражения Лямбда следующим образом. a.OrderBy(s=>s.Length).ToArray();, но я хочу это сделать, определив разные функции. Какую ошибку я сделал?Передача Func <TSource, TKey> keySelector error

+0

код вы написали, кажется, компилировать и выполнять хорошо, какую ошибку вы получили? –

+0

Невозможно вывести параметры типа для 'Enumerable.OrderBy' – SLaks

+0

Он тоже скомпилируется для меня. –

ответ

6

Выражение fun - это нетипизированное выражение, называемое группой методов .
Поскольку группа методов не имеет типа, компилятор не может вывести параметры типа общего метода OrderBy.

Вам необходимо явно передавать параметры типа, например:

a = a.OrderBy<string, int>(fun).ToArray(); 

Или

a = a.OrderBy(new Func<string, int>(fun)).ToArray(); 
+0

У меня создалось впечатление, что вы на самом деле могли бы ... не было бы «забавно» вызываться как Func ? Я смущен, потому что я скопировал его код и скомпилировал и выполнил отлично на .NET 3.5, не касаясь его. –

+0

@Dynami: он только терпит неудачу, если вы передаете группу методов (в отличие от переменной делегата), я попробовал это; он не работает (аргументы типа для метода «System.Linq.Enumerable.OrderBy (System.Collections.Generic.IEnumerable , System.Func ) 'не могут быть выведены из использования. явно указывая аргументы типа.) – SLaks

+2

Хм, я повторил это с моей покупкой VS2008, и вы, кажется, правы. Поэтому я думаю, что под VS2010 с.NET 3.5, который я фактически компилирую с компилятором C# 4, не знал этого. –

3

Вот что произошло. Когда я впервые применил алгоритм вывода типа метода для C# 3, я рассуждал, поскольку SLaks предлагает: группы методов не имеют типа, из них не было выведено из них на C# 2, и для разрешения перегрузки необходимо выбрать метод из группы методов, зная типы аргументов, которые именно мы пытаемся сделать; это проблема с курицей и яйцом. Я писал о том, что в ноябре 2007 года:

http://blogs.msdn.com/ericlippert/archive/2007/11/05/c-3-0-return-type-inference-does-not-work-on-member-groups.aspx

Существовал так много теряемые на это, что мы решили вернуться к этому вопросу и изменить алгоритм типа логического вывода, так что мы сделали выводы из методов групп при условии достаточно умозаключений было уже сделано, что разрешение перегрузки может продолжаться в группе методов.

К сожалению, это изменение произошло слишком поздно в цикле и не попало в C# 3. Мы отложили его до C# 4, и там вы идете.

Я писал о том, что в 2008 году:

http://blogs.msdn.com/ericlippert/archive/2008/05/28/method-type-inference-changes-part-zero.aspx

Смежные вопросы