我在 C++/CLI (Visual Studio 2012) 中有这个
Enumerable::Max((IEnumerable<IFoo^>^) Foos, [](IFoo^ f){return f->Id;});
但这会导致此错误:
没有重载函数“System::Linq::Enumerable::Max”的实例与参数列表匹配
它让我发疯,因为 lambda 没有任何问题。我需要以某种方式将其转换为 Func 吗?
我在 C++/CLI (Visual Studio 2012) 中有这个
Enumerable::Max((IEnumerable<IFoo^>^) Foos, [](IFoo^ f){return f->Id;});
但这会导致此错误:
没有重载函数“System::Linq::Enumerable::Max”的实例与参数列表匹配
它让我发疯,因为 lambda 没有任何问题。我需要以某种方式将其转换为 Func 吗?
C++/CLI 编译器不支持 C++11 lambda 表达式,它们不能转换为委托对象。尽管 .NET 有一个很大的领先优势,但从未添加对托管 lambda 的支持,而且肯定永远不会添加。
您需要一个带有帮助函数的委托对象,该函数返回 IFoo->id,如下所示:
int returnId(IFoo^ obj) { return obj->Id; }
...
int max = Enumerable::Max((IEnumerable<IFoo^>^) Foos,
gcnew Func<IFoo^, int>(returnId));
AFAIK,Visual C++ 中的 lambdas 仍然是纯原生的。您绝对应该说出您正在使用的编译器版本。
你有没有尝试过
Func<IFoo^, IdType>^ conversion = [](IFoo^ f){return f->Id;};
Enumerable::Max((IEnumerable<IFoo^>^) Foos, conversion);
这会将委托创建与重载解析分开......我很确定该错误与 LINQ 方法无关。