Upload
ryota-murohoshi
View
927
Download
0
Embed Size (px)
Citation preview
何が問題か?List<string> stringList = new List<string> ();IList list = stringList;
list.Add (1); // コンパイルは通る 実行時に例外発生!
List<T>のインスタンスをIListインターフェースの変数に代入System.ArgumentExcep1onが発生することがある!
※List<T>はC#だとクラスです
ジェネリックインターフェースの例 (名前の先頭にIがつく)
• IList<T>
• IDic,onary<TKey,5TValue>
ジェネリッククラスの例 (インターフェースじゃなくてクラス)
• List<T>
• Dic+onary<TKey,4TValue>
System.Collec,ons名前空間下の非ジェネリックな別のコレクション
例えばIListとかIDic(onaryとかArrayListとか
あと、System.Collec,ons.Specialized名前空間下にも
IListインターフェース非ジェネリックなリストを司るインターフェース• メソッドとプロパティの一例"*"void"Add(Object"value)"要素の追加"*"Object"this[int"index]"{"get;"set;"}"インデクサ
• 継承しているインターフェースはICollec@onとIEnumerable
IList<T>インターフェース(1)
ジェネリックなリストを司るインターフェースメソッドとプロパティの一例• void&Add(T&ietm)&要素の追加
• T&this[int&index]&{&get;&set;&}&インデクサジェネリックなメソッドとプロパティに注目!
IList<T>インターフェース(2)
継承しているインターフェース• ICollec(on<T>
• IEnumerable<T>
• IEnumerable
IListインターフェースを継承はしていない!
List<T>クラスが実装しているインターフェース• IList'<)ここ注目!!!!
• IList<T>'<)あとここも!
• ICollec1on
• ICollec1on<T>
• IReadOnlyList<T>、IReadOnlyCollec1on<T>
• IEnumerable<T>、IEnumerable
結果こうなるList<string> stringList = new List<string> ();
IList list = stringList;
list.Add (1); // System.ArgumentExceptionが発生!
明示的なインターフェースの実装なんちゃらは割愛
つまりList<T>がIListを実装したのは、
非ジェネリックコレクションからジェネリックコレクションへの
移行をスムーズに行うため?
既存自作ライブラリがList<T>引数に取れないから使わないを防止するため?
「IListを引数にとるメソッドにList<T>渡せるなら、List<T>使ってみるか!」が狙い?