論理とその応用ョンにします。汎用の継承
-
02-07-2019 - |
質問
ものを継承すオブジェクトです。この継承関係を示します。べき暗黙のうちにキャストを継承ツリーが打ち出されている。-
object me = new Person();
そのため、以下のことを通じてその論理的結論は、グループの人々にもオブジェクトのグループ:
List<Person> people = new List<Person>();
people.Add(me);
people.Add(you);
List<object> things = people; // Ooops.
を除き、なのは、人。純どちらかを見落とす、または理由があり、なんなのかし出せない場合も考えられます。少なくとも一度はい状況に陥れば役に立つものがあったので最後にイヤhack(サブクラスか実装にキャストオペレーター).
こある理由のためにこの行為は?がより簡単な解の挙動の?
の記録まっていた状況がしたかったこのような行動をした汎用の印刷機能表示のリストでオブジェクトを呼び出しToString()でフォーマット文字列がります。
他のヒント
利用できるlinqキャストで
IEnumerable<Person> oldList = someIenumarable;
IEnumerable<object> newList = oldlist.Cast<object>()
一見、このな感じる。でもそうなんです。このコード:
List<Person> people = new List<Person>();
List<object> things = people; // this is not allowed
// ...
Mouse gerald = new Mouse();
things.add(gerald);
今までに急に List
の Person
オブジェ...と Mouse
中に入って楽しむこともできる。
この型のオブジェクト A<T>
変数の型 A<S>
が許可されない場合でも、 S
にはスーパータイプの T
.
のlinq回避策が実施しています。他の回避策、お使いの型のオブジェクトでのリストとしてIEnumerableなる汎用のバージョン)。
編集:C#4(現在ベータ版)を支える共変微分型のパラメータにはIEnumerable.ができません直接割り当て一覧<object>できる場合にはリストの方法を見込んIEnumerable<object>.
が何をしようという流れを理論的には、実際に機能する多くの言語んでネイティブです。これは頂きましたというco/魂斗羅の差異、な場面でどのようにオブジェクトを暗黙のうちにキャストから気をつけなければいけないのりによるコンパイラです。しかし幸いなことにC#4.0を共分散とcontravarianceにC#アリーナなどの暗黙の鋳このようなきが可能です。
詳細については、以下のChannel9映像まれていますが、これら:
とlinqの拡張方法でできる
IEnumerable<object> things = people.Cast<object>();
List<object> things = people.Cast<object>().ToList();
そしておりますので強くタイピングのリストに暗黙的に変換います。