【问题标题】:Initialize List<T> with array in CLR C++?在 CLR C++ 中使用数组初始化 List<T>?
【发布时间】:2012-08-28 04:46:23
【问题描述】:

我想知道为什么这段代码在 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)));

【问题讨论】:

  • sn-p 有点坏了,但这在 VS2008 上运行良好。这是什么版本的编译器? “好的,我知道该怎么做!”这个答案中的短语可能是相关的:stackoverflow.com/a/11164210/17034

标签: c# arrays list c++-cli clr


【解决方案1】:

您需要使用safe_cast。根据MSDN documentation on System::Array

重要

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

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

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

【讨论】:

  • C# 编译器似乎更聪明,它可以在编译时处理。
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2016-08-22
  • 1970-01-01
  • 2021-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多