3

我在 C++/CLI (Visual Studio 2012) 中有这个

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

但这会导致此错误:

没有重载函数“System::Linq::Enumerable::Max”的实例与参数列表匹配

它让我发疯,因为 lambda 没有任何问题。我需要以某种方式将其转换为 Func 吗?

4

2 回答 2

8

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));
于 2013-10-21T15:10:21.870 回答
-1

AFAIK,Visual C++ 中的 lambdas 仍然是纯原生的。您绝对应该说出您正在使用的编译器版本。

你有没有尝试过

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

这会将委托创建与重载解析分开......我很确定该错误与 LINQ 方法无关。

于 2013-10-21T15:08:06.417 回答