我在 C++/CLI (Visual Studio 2012) 中有这个
Enumerable::Max((IEnumerable<IFoo^>^) Foos, [](IFoo^ f){return f->Id;});
但它会导致这个错误:
No instance of overloaded function "System::Linq::Enumerable::Max" matches argument list
这让我很生气,因为 lambda 没有任何问题。我需要以某种方式将它转换为 Func 吗?
最佳答案
C++/CLI 编译器不支持 C++11 lambda 表达式,它们不能转换为委托(delegate)对象。尽管 .NET 有很大的领先优势,但从未添加对托管 lambda 的支持,而且肯定永远不会添加。
您需要一个带有返回 IFoo->id 的辅助函数的委托(delegate)对象,可能如下所示:
int returnId(IFoo^ obj) { return obj->Id; }
...
int max = Enumerable::Max((IEnumerable<IFoo^>^) Foos,
gcnew Func<IFoo^, int>(returnId));
关于用于 LINQ 静态方法的 C++/CLI Lambda 选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19497473/