5

我想知道为什么这段代码在 C++/CLI 中不起作用,但在 C# 中却很容易?

List<Process^>^ processList = gcnew List<Process^>(
  Process::GetProcessesByName(this->processName)););

错误 C2664: 'System::Collections::Generic::List::List(System::Collections::Generic::IEnumerable ^)' : 无法将参数 1 从 'cli::array ^' 转换为 'System::Collections ::Generic::IEnumerable ^'

这是我想出的。做得非常好。:)

List<Process^>^ processList = gcnew List<Process^>(
  safe_cast<System::Collections::Generic::IEnumerable<Process^>^>
    (Process::GetProcessesByName(this->processName)));
4

1 回答 1

10

你需要使用safe_cast. 根据MSDN 文档System::Array

重要的

从 .NET Framework 2.0 开始,Array 类实现了System.Collections.Generic::IList<T>System.Collections.Generic::ICollection<T>System.Collections.Generic::IEnumerable<T>泛型接口。这些实现在运行时提供给数组,因此对文档构建工具不可见。因此,泛型接口不会出现在Array类的声明语法中,并且没有接口成员的参考主题,只能通过将数组转换为泛型接口类型(显式接口实现)才能访问这些成员。将数组强制转换为这些接口之一时要注意的关键是添加、插入或删除元素的成员 throw NotSupportedException

如您所见,强制转换必须在运行时在 C++ 中显式完成,例如

List<Process^>^ processList = gcnew List<Process^>(
    safe_cast<IEnumerable<T> ^>(
        Process::GetProcessesByName(this->processName)));
于 2012-08-28T05:03:21.843 回答