SlideShare a Scribd company logo
1 of 39
Download to read offline
C#のList<T>がIListを実装している件
自己紹介
名前:室星!亮太
所属:Fuller,'Inc.
2年前までJavaやってました!
Androidアプリ開発やってました。
今はC#やってます!
C#(Mono2.x)でUnityでゲーム作ってます!
そんな私がある疑問を
ぶつけたいと思います!
C#のList<T>がIListを実装している件
正直IListを実装する必要がないと思ってました
そして、ちょっと問題があります
何が問題か?
List<string> stringList = new List<string> ();
IList list = stringList;
list.Add (1); // コンパイルは通る 実行時に例外発生!
List<T>のインスタンスをIListインターフェースの変数に代入
System.ArgumentExcep1onが発生することがある!
※List<T>はC#だとクラスです
背景を説明します
C##2.0からジェネリックが導入され
ジェネリックなコレクションの
クラス、インターフェースが追加されました
(System.Collec-ons.Generic下)
ジェネリックインターフェースの例 (名前の先頭にIがつく)
• IList<T>
• IDic,onary<TKey,5TValue>
ジェネリッククラスの例 (インターフェースじゃなくてクラス)
• List<T>
• Dic+onary<TKey,4TValue>
じゃあその前、C##1.0や1.1では?
System.Collec,ons名前空間下の
非ジェネリックな別のコレクション
例えばIListとかIDic(onaryとかArrayListとか
あと、System.Collec,ons.Specialized名前空間下にも
ポイント
C#のジェネリックコレクションと
非ジェネリックコレクションは
別のクラス・別のインターフェース
(ここJavaと違う!)
IListインターフェース
と
IList<T>インターフェース
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インターフェースを継承はしていない!
IListインターフェースとIList<T>インターフェース
• メソッドとプロパティは似ているものもある
• 非ジェネリックかジェネリックかという大きな違い
• 継承関係はない(ここ重要!)
ポイント
IList<T>インターフェース実装するからって、
必ずIListインターフェース実装する必要ない
List<T>クラスはどうなっている?
List<T>クラスが実装しているインターフェース
• IList'<)ここ注目!!!!
• IList<T>'<)あとここも!
• ICollec1on
• ICollec1on<T>
• IReadOnlyList<T>、IReadOnlyCollec1on<T>
• IEnumerable<T>、IEnumerable
List<T>クラスはIList<T>を実装
加えて非ジェネリックなIListも
実装していて...
結果こうなる
List<string> stringList = new List<string> ();
IList list = stringList;
list.Add (1); // System.ArgumentExceptionが発生!
明示的なインターフェースの実装なんちゃらは割愛
List<T>がIList実装しているの必要なくない?
IList<T>実装してるから、それでよくない?
むしろIList邪魔じゃない?
なぜList<T>はIListを
実装しているか調べてみた
stackoverflow
h"p://stackoverflow.com/ques5ons/6156010/why<list<implements<ilist
ジェネリックが導入されたC##2.0/.NET#2.0
が登場した時を想像しましょう
2005年12月8日
AKB48&劇場で初公演
の1ヶ月前、2005年11月7日
.NET%2.0リリース(wikipediaより)
C#1.0と1.1では
当然全てのコードが非ジェネリック!!!
そのため既存のコードは、
引数としてList<T>やIList<T>はとらない!
ここでIListが活躍!
List<T>クラスは
IListインターフェースを実装してるおかげで
IListを引数にとるメソッドにList<T>を渡せる
既存のC##1.0/1.1のライブラリで、
IList引数にとるメソッドには
List<T>を渡せる!
つまりList<T>がIListを実装したのは、
非ジェネリックコレクションからジェネリックコレクションへの
移行をスムーズに行うため?
既存自作ライブラリがList<T>引数に取れないから使わないを防止するため?
「IListを引数にとるメソッドにList<T>渡せるなら、List<T>使ってみるか!」が狙い?
どうでしょう?
あってますかね?
それとももしかして私が知らないだけで、
IListの活用場面多かったりします?
ご清聴ありがとうございました

More Related Content

More from Ryota Murohoshi

More from Ryota Murohoshi (11)

広告ネイティブプラグインの辛かった話しよっか
広告ネイティブプラグインの辛かった話しよっか広告ネイティブプラグインの辛かった話しよっか
広告ネイティブプラグインの辛かった話しよっか
 
UnityでC#を勉強しはじめた私の主張
UnityでC#を勉強しはじめた私の主張UnityでC#を勉強しはじめた私の主張
UnityでC#を勉強しはじめた私の主張
 
普段C#を使っている僕から見たKotlin
普段C#を使っている僕から見たKotlin普段C#を使っている僕から見たKotlin
普段C#を使っている僕から見たKotlin
 
T4使ってみた
T4使ってみたT4使ってみた
T4使ってみた
 
UnityでのLINQ活用例
UnityでのLINQ活用例UnityでのLINQ活用例
UnityでのLINQ活用例
 
私とUnityとLINQと
私とUnityとLINQと私とUnityとLINQと
私とUnityとLINQと
 
「LINQ」っていう名前だけでも 覚えて帰ってください!
「LINQ」っていう名前だけでも 覚えて帰ってください!「LINQ」っていう名前だけでも 覚えて帰ってください!
「LINQ」っていう名前だけでも 覚えて帰ってください!
 
JXUGのLTだけれどもUnity+iOS+LINQの話をしようと思う!
JXUGのLTだけれどもUnity+iOS+LINQの話をしようと思う!JXUGのLTだけれどもUnity+iOS+LINQの話をしようと思う!
JXUGのLTだけれどもUnity+iOS+LINQの話をしようと思う!
 
RxJava初心者の私が良いと思ったやり方、素敵だと思った資料など
RxJava初心者の私が良いと思ったやり方、素敵だと思った資料などRxJava初心者の私が良いと思ったやり方、素敵だと思った資料など
RxJava初心者の私が良いと思ったやり方、素敵だと思った資料など
 
共変戻り値型って知ってますか?
共変戻り値型って知ってますか?共変戻り値型って知ってますか?
共変戻り値型って知ってますか?
 
明日からちょっと KotlinでAndroidが書きたくなる(かもしれない?)SAM変換と拡張関数
明日からちょっと KotlinでAndroidが書きたくなる(かもしれない?)SAM変換と拡張関数明日からちょっと KotlinでAndroidが書きたくなる(かもしれない?)SAM変換と拡張関数
明日からちょっと KotlinでAndroidが書きたくなる(かもしれない?)SAM変換と拡張関数
 

Recently uploaded

Recently uploaded (10)

LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 

C#のList_TがIListを実装している件