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クラスの宣言構文に表示されず、配列をジェネリック インターフェイス型にキャストすることによってのみアクセスできるインターフェイス メンバー (明示的なインターフェイスの実装) に関するリファレンス トピックはありません。これらのインターフェイスのいずれかに配列をキャストするときに注意すべき重要なことは、要素を追加、挿入、または削除するメンバーが をスローすることNotSupportedExceptionです。

ご覧のとおり、キャストは実行時に C++ で明示的に行う必要があります。

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