C ++ / CLI Lambda Selector для статических методов LINQ

У меня есть это в C ++ / CLI (Visual Studio 2012)

Enumerable::Max((IEnumerable<IFoo^>^) Foos, [](IFoo^ f){return f->Id;});

Но это приводит к этой ошибке:

Ни один экземпляр перегруженной функции «System :: Linq :: Enumerable :: Max» не соответствует списку аргументов

Это сводит меня с ума, потому что в лямбде нет ничего плохого. Нужно ли как-нибудь привести его к Func?

3

Решение

Компилятор C ++ / CLI не поддерживает лямбда-выражения C ++ 11, они не могут быть преобразованы в объект делегата. Хотя у .NET был большой старт, поддержка управляемых лямбд никогда не добавлялась и, конечно, никогда не будет.

Вам понадобится объект делегата с вспомогательной функцией, которая возвращает IFoo-> id, может выглядеть так:

int returnId(IFoo^ obj) { return obj->Id;  }
...
int max = Enumerable::Max((IEnumerable<IFoo^>^) Foos,
gcnew Func<IFoo^, int>(returnId));
6

Другие решения

AFAIK, лямбды в Visual C ++ по-прежнему только для нативных. Вы определенно должны сказать, какую версию компилятора вы используете.

Ты пытался

Func<IFoo^, IdType>^ conversion = [](IFoo^ f){return f->Id;};
Enumerable::Max((IEnumerable<IFoo^>^) Foos, conversion);

Это отделяет создание делегата от разрешения перегрузки … Я совершенно уверен, что ошибка не имеет ничего общего с методом LINQ.

0

По вопросам рекламы [email protected]