3

すべてがオブジェクトから継承されます。継承の基本です。すべてを暗黙的に継承ツリーにキャストできます。

object me = new Person();

したがって、これを論理的な結論までたどると、人のグループはオブジェクトのグループでもあります。

List<Person> people = new List<Person>();
people.Add(me);
people.Add(you);
List<object> things = people; // Ooops.

それがうまくいかないことを除けば、.NET を設計した人々がこれを見落としたか、または何らかの理由があり、そのどちらかはわかりません。少なくとも 1 回は、これが役立つ状況に遭遇しましたが、最終的に厄介なハック (キャスト演算子を実装するためだけに List をサブクラス化する) を使用する必要がありました。

問題はこれです: この行動には理由がありますか? 望ましい動作を得るためのより簡単な解決策はありますか?

記録として、私がこの種の動作を望んでいたのは、ToString() を呼び出して文字列を適切にフォーマットすることでオブジェクトのリストを表示する汎用印刷機能だったと思います。

4

6 に答える 6

5

OK、.net でジェネリックスを使用したことのある人なら誰でも、いずれかの時点でこれに遭遇したに違いありません。

はい、直感的に動作するはずです。いいえ、現在のバージョンの C# コンパイラにはありません。

Eric Lippert は、この問題について非常に優れた説明をしています (11 部か何かで構成されており、ところどころで頭を悩ませることになるかもしれませんが、読む価値は十分にあります)。ここを参照してください。

編集:

別の関連リンクを掘り下げました。これは、Javaがこれをどのように処理するかについて説明しています。こちらをご覧ください

于 2008-09-21T03:13:30.957 に答える
4

linq を使用してキャストできます。

IEnumerable<Person> oldList = someIenumarable;
IEnumerable<object> newList = oldlist.Cast<object>()
于 2008-09-21T03:13:11.550 に答える
3

一見すると、これは直感的に理解できません。しかし、そうです。このコードを見てください:

List<Person> people = new List<Person>();
List<object> things = people; // this is not allowed
// ...
Mouse gerald = new Mouse();
things.add(gerald);

今、私たちは突然ListPersonオブジェクトを持っています... そのMouse中に があります!

これは、 が のスーパータイプであってもA<T>、 型の変数への型のオブジェクトの代入がA<S>許可されない理由を説明しています。ST

于 2008-09-21T03:23:14.897 に答える
3

linq の回避策は良いものです。型オブジェクトを使用しているため、別の回避策は、リストを IEnumerable (ジェネリック バージョンではない) として渡すことです。

編集: C# 4 (現在はベータ版) は、IEnumerable で共変型パラメーターをサポートしています。List<object> に直接割り当てることはできませんが、IEnumerable<object> を期待するメソッドにリストを渡すことができます。

于 2008-09-21T03:26:02.860 に答える
2

あなたがやろうとしていることは確かに論理的に流れますが、実際には多くの言語がネイティブにサポートしていない機能です。これは、co / contra分散と呼ばれるものであり、コンパイラによってオブジェクトをあるものから別のものに暗黙的にキャストできる時期と方法に関係しています。ありがたいことに、C#4.0はC#アリーナに共変性と反変性をもたらし、このような暗黙のキャストが可能になるはずです。

これの詳細な説明については、次のChannel9ビデオが役立つはずです。

http://channel9.msdn.com/shows/Going+Deep/Inside-C-40-dynamic-type-optional-parameters-more-COM-friendly/

于 2009-06-01T19:30:49.657 に答える
1

linq 拡張メソッドを使用すると、次のことができます

IEnumerable<object> things = people.Cast<object>();
List<object> things = people.Cast<object>().ToList();

それ以外の場合、リストを強く入力しているため、暗黙的な変換は許可されません。

于 2008-09-21T03:13:37.430 に答える