4

わかりました、私は周りを見回しましたが、答えが見つかりません。を返すメソッドがあります

IEnumerable<ICar> 

呼び出し元のメソッドは、メソッドの結果を

List<ICar> 

しかし、次のエラーが発生します。

System.Collections.Generic.IEnumerable<Test.Interfaces.ICar> to 
System.Collections.Generic.List<Test.Interfaces.ICar>. An explicit conversion exists   
(are you missing a cast?)   

私はmsdnを見ました

IEnumerable<T> interface and List<T> class. 

次の行は msdn からのものです。

public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection,   
IEnumerable

割り当てられない理由がわかりません

IEnumerable<ICar> to List<ICar>. 

誰かが私にこれを説明してもらえますか。何が欠けていますか。

4

6 に答える 6

9

すべてIEnumerable<T>ではありませんList<T>。逆もまた然り。

悪い習慣であるキャストを試みることができ、List<T>実際にリストでない場合は失敗する可能性があります。または、列挙型から新しいリストを作成できます。

new List<T>(yourEnumerable);

またはLinqを使用

yourEnumerable.ToList();
于 2012-05-02T01:00:30.690 に答える
3

List<ICar>実装IEnumerable<ICar>- あなたは正しいです。ただし、これは暗黙的に aList<ICar>を an に変換できることを意味します。その逆はできません。問題を回避するには、 を呼び出してに変換します。IEnumerable<ICar>ToList()IEnumerableList

于 2012-05-02T01:01:11.983 に答える
1

を呼び出すと、をToListに変換できます。IEnumerable<Car>List<Car>

IEnumerable<ICar> cars = ...;
List<ICar> list = cars.ToList(); // OK

IEnumerable<Car> へのダウンキャストを試みることはできますが、これは自動的には行われませんList<Car>:

IEnumerable<ICar> cars = ...;
List<ICar> list = (List<ICar>)cars; // Compiles, but could fail at runtime.

暗黙的な変換演算子がないため、C# コンパイラはキャストなしの代入を許可しません。ダウンキャストは実行時に失敗する可能性があるためToList、ほとんどの状況で使用することをお勧めします。

于 2012-05-02T01:00:54.813 に答える
1

IEnumerable<T>a は a である可能List<T>性がありますが、必ずしも 1 であるとは限りません。LINQ を使用IEnumerable<T>.ToList<T>()して任意のIEnumerable<T>ものをList<T>

IEnumerable<T> foo = ThatMethodYouWereTalkingAbout();
List<T> bar;
if (foo is List<T>)
    bar = (List<T>)foo;
} else {
    bar = new List<T>(foo);
}
于 2012-05-02T01:01:17.797 に答える
0

変数の代入によって、あまり派生していない型をより派生した型に割り当てることはできません。それはタイプセーフではありません。

言語仕様で。話す、List<ICar>は割り当て互換性がありませんIEnumerable<ICar>。しかし、その逆は真です。 IEnumerable<ICar>と互換性のある割り当てList<ICar>です。

割り当ての互換性を関係として視覚化すると、より理にかなっています。x <= y が true の場合、x >= y は true ではありません (y = x でない限り)。(具体的には、2 < 3 = true なので、2 > 3 は true ではありません。)

あなたの場合、車の List の値を type の変数に割り当てることができますIEnumerable<ICar>

関係を次のように表すことができれば

List<ICar><= IEnumerable<ICar>= 真。

すると、

List<ICar>>= IEnumerable<ICar>= 偽

私たちが知っている最初の関係が真であるため、それは偽です。

于 2012-05-02T02:22:34.973 に答える
0

すべてのリストは IEnumerable ですが、すべての Innumerable はリストではありません。MSDN IEnumerableによると

非ジェネリック コレクションに対する単純な反復をサポートする列挙子を公開します。

IEnumerable が約束するのは、次の要素を取得できるということだけです。List はさらに多くのことを約束します。たとえば、インデックスによるアクセスと、それが有限の長さであることです。

これは IEnumerable には当てはまりません。たとえば、以下のコードは実際にはリストを作成しません。実際、そこからリストを作成することはできません。新しい要素を要求するたびに、1 つ提供されます。しかし、それは尋ねられたときにのみ計算します。:

IEnumerable<int> Numbers() {
    int i=0;
    while(true) {
        yield return unchecked(i++);
    }
}

ToListを呼び出してリストを取得します。これは、上記のような場合に終了しない可能性があることに注意してください。

于 2012-05-02T01:10:13.177 に答える