передача Func <TSource, TKey> ошибка keySelector - PullRequest
3 голосов
/ 11 мая 2010
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(); но я хочу это сделать, определив другую функцию. Какую ошибку я совершил?

Ответы [ 3 ]

6 голосов
/ 11 мая 2010

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

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

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

Или,

a = a.OrderBy(new Func<string, int>(fun)).ToArray();
4 голосов
/ 11 мая 2010

SLaks верен в том, что компилятор C # 3 этого не допустит, но важно отметить, что компилятор C # 4 скомпилирует ваш пример без проблем.

3 голосов
/ 14 мая 2010

Вот что случилось. Когда я впервые реализовал алгоритм вывода типа метода для 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

...