2017-12-15 10 views
0

このタイプの変換を許可しない理由を知りたいと思います。このpost in SOの件名にはすでに近づいていましたが、なぜこれがネイティブにできないのかについての低レベルの説明が必要です。なぜC#はオブジェクトへの匿名キャストを許可していませんか?

なぜこれらのキャストが失敗するのですか?

OBS:私はそれを反映させることが可能であることを知っています。

IList<People> peopleList = new List<People>() 
{ 
    new People() { Name = "Again", Age = 10 }, 
    new People() { Name = "Over", Age = 20 }, 
    new People() { Name = "Jonh", Age = 30 }, 
    new People() { Name = "Enzo", Age = 40 }, 
}; 

var anonymous = (from p in peopleList 
       select new 
       { 
        Name = p.Name, 
        Age = p.Age 
       }); 

// Does not work 
IList<People> listt = (IList<People>)anonymous; 
//Does not Work 
IList<People> listt = (anonymous as List<People>); 
+8

私はそれが*うまくいくべきだと思うのは興味深いと思います。匿名型は、同じフィールドを持っていても、別の型ではありません。同じことは、匿名であるかどうかにかかわらず、他のどのタイプにも適用されます。それは言語がどのように構築されたか、C#ではダックタイピングがありません。 – nvoigt

+1

なぜ機能するのですか?それは匿名型であり、 'People'インスタンスではありません。あるものから別のものへの考えられるキャストはありません。キャストとは、「このオブジェクトを他の同等のタイプと同じように扱う」という意味です。この匿名型が 'People'に相当するということは何もありません。あなたがペットを表現するためにそれを使ったらどうですか? –

+3

'Person'を' Dog'にキャストできますか?どちらも名前と脚があるので、なぜキャストは機能しないのですか? –

答えて

5

anonymousが正常にIList<People>またはList<People>にキャストできない理由の質問です。

  • クエリ式の値は、クエリを実行できるオブジェクトあります。クエリ実行の結果セットではありません。 anonymousIList<T>ではなくIEnumerable<T>を実装していますが、確かにそれはサブタイプList<T>ではありません。したがって、IList<T>またはList<T>タイプにキャストすることはできません。それが必要ならば、ToList()を使用してクエリを実行し、結果セットをリストに格納します。
  • クエリをIEnumerable<People>にキャストできますか?いいえ。Peopleに関連付けられた値の一部をコピーした一連の匿名型オブジェクトです。それは一連の匿名オブジェクトであり、一連の人々ではありません。

また、新しいC#7コードでは、アプリケーションでできる場合は、匿名型の代わりにタプルを使用する方がよいことにも注意してください。彼らは型式のシステムでより良いサポートを持っており、より少ない回収圧力を生み出します。

関連する問題