14

メソッドがSystem.Collections.IList型のパラメーターを受け取る場合、合法的に/安全に型の値を渡すことができSystem.Collections.Generic.IEnumerable<T>ますか?

これが可能である理由と、メソッド内でが使用されTたときにオブジェクトに実際に何が起こるかについて、完全に説明していただければ幸いです。IEnumerable<T>

オブジェクトの基本タイプに変換されていますか?

として使用されていSystem.Collections.IEnumerableますか?

これが問題(つまり、パフォーマンスの問題)を引き起こすシナリオはありますか?

よろしくお願いします、ジョン

4

5 に答える 5

32

いいえIEnumerable<T>、をとるメソッドにを渡すことはできませんIList。インターフェイスIEnumerable<T>はに変換できずIList、型の変数をIEnumerable<T>メソッドに渡そうとするIListと、コンパイルエラーが発生します。

この作業を行うには、次のいずれかを実行する必要があります

  1. を使用する代わりに、との両方をIEnumerable<T>実装する型への参照を維持します。ここで良い候補ですIEnumerable<T>IListList<T>
  2. インスタンスをに変換IEnumerable<T>可能な新しいオブジェクトに変換しIListます。たとえば、3.5以降では、extensionメソッドを呼び出して、列挙型 .ToList()に新しいものを作成できます。List<T>
于 2010-01-04T16:14:27.500 に答える
4

に電話する必要がありますToList()http://msdn.microsoft.com/en-us/library/bb342261.aspx

于 2010-01-04T16:09:41.290 に答える
2

ToList()いいえ。拡張メソッドを使用しないとできません。これによってパフォーマンスの大きな問題が発生することはないと思います。別の方法がある場合は、時間を計って比較してください。

また、使用することもできますnew List<T>(myIEnumerable)-ドキュメントには、その関数はO(n)操作であると記載されていますが、他に何も見つかりませんToList()List<T>また、も実装するIListことを忘れないでIList<T>ください。

于 2010-01-04T16:08:21.043 に答える
1

IEnumerableはコレクションへのインデックス付きアクセスを許可しませんが、IListは許可します。したがって、IListはIEnumerable以上のものであり、それを回避することはできません。もちろん、一部のクラスは両方のインターフェース(たとえば、List <>)を実装し、それらは正常に機能します。

IEnumerableからIListに移行する必要がある場合は、最初にキャストを試すことができます。運が良ければ、それは機能します。そうでない場合は、IEnumerableコレクションをforeachして、新しいIListを作成する必要があります。

編集:他の人が示唆しているように自分自身を説得する代わりに、ToList()を使用します。

于 2010-01-04T16:09:58.747 に答える
0

いいえ、IEnumerableを渡すことはできません。IListはIEnumerableを実装しているため、メソッドにIListを渡すと、IEnumerableとして安全に使用できます。VSは以下をコンパイルしません:

private static void Test(IList<int> list){ }

Test(Enumerable.Range(0, 10));

返されたエラー:

Argument '1': cannot convert from System.Collections.Generic.IEnumerable<int>' to 'System.Collections.Generic.IList<int>'
于 2010-01-04T16:10:00.707 に答える