C++11中lamda表达式由编译器编译为函数对象, 即 是一个对象, 而C#中的lamda表达式解释为delegate, 即函数指针, 故不能通用.
如果要在C++/Cli中使用 类似 C# 中的 .Select<TSource, TResult> 只能gcnew delegate
ListView ^ listView = gcnew ListView;
ListViewItem ^ item1 = gcnew ListViewItem; item->Tag = System::IntPtr(pFoo1);
ListViewItem ^ item2 = gcnew ListViewItem; item->Tag = System::IntPtr(pFoo2);
... ...
要得到 IEnumable<System::IntPtr> :
IEnumable<System::IntPtr> ^ ptrList =
System::Linq::Enumerable::Select<ListViewItem^, System::IntPtr>(
System::Linq::Enumerable::Cast<ListViewItem ^>(listView1->SelectedItems),
gcnew System::Func<ListViewItem^, System::IntPtr>(toIntPtr);
需要额外定义函数
System::IntPtr toIntPtr(ListViewItem ^ item) { return (System::IntPtr)item->Tag; }