У меня есть это в C ++ / CLI (Visual Studio 2012)
Enumerable::Max((IEnumerable<IFoo^>^) Foos, [](IFoo^ f){return f->Id;});
Но это приводит к этой ошибке:
Ни один экземпляр перегруженной функции «System :: Linq :: Enumerable :: Max» не соответствует списку аргументов
Это сводит меня с ума, потому что в лямбде нет ничего плохого. Нужно ли как-нибудь привести его к Func?
Компилятор 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));
AFAIK, лямбды в Visual C ++ по-прежнему только для нативных. Вы определенно должны сказать, какую версию компилятора вы используете.
Ты пытался
Func<IFoo^, IdType>^ conversion = [](IFoo^ f){return f->Id;};
Enumerable::Max((IEnumerable<IFoo^>^) Foos, conversion);
Это отделяет создание делегата от разрешения перегрузки … Я совершенно уверен, что ошибка не имеет ничего общего с методом LINQ.