ブルーノのC#プログラミング & unity勉強日記

プログラミング素人、ブルーノの自主勉強ノートです。他のプログラミングを勉強したい方の助けになれば幸いです。その他趣味の雑記もしていきたいです

匿名型、共変性・反変性

f:id:covory10101101276:20180203200228j:plain

ラ・ピエドラ・デル・ペニョール

 

みなさんこんにちは🌚

一日テニスコートの雪かきでヘトヘトのブルーノです。思ったよりも疲れるものなんですね雪かきって😪今回はジェネリック編ラストです。

 

匿名型

匿名というキーワードはデリゲートでも出てきましたね。

匿名メソッドとラムダ式について - ブルーノのC#プログラミング & unity勉強日記

匿名メソッドの特徴と同じように、オブジェクトを名前をつけずに作ることができます。実際に見てみましょう。

f:id:covory10101101276:20180203202841p:plain

f:id:covory10101101276:20180203202847p:plain

特に特徴もない普通のプログラムですね。結果も目に見えています。このget:setの部分は下のように簡略化できます。

f:id:covory10101101276:20180203234033p:plain

そして匿名型を使うと以下のようになります。

f:id:covory10101101276:20180203234232p:plain

すごいですね。もはや事前に準備なしで入れるものだけである程度クラスを作ってくれるんですね。

これが匿名型です(ジェネリック関係ない???)

 

ジェネリックの共変性・反変性

なんかかっこいい言葉がセットで出てきました。反変性は「はんぺんせい」ではなく「はんへんせい」だそうです。先に画像をみてもらった方が説明しやすそうです。

f:id:covory10101101276:20180203235947p:plain

f:id:covory10101101276:20180203235954p:plain

IEnumrableというキーワードが出てきましたね。これは元から実装されているクラスの一種でEnum+ableということで数値を入れることができたり、それに関する様々な目sっどを持ったクラス、ということでしょうか。このクラスにstring型をパラメータとして初めに配列を生成してます。そして次の行ですが、string型というのは、object型から派生している型です。なので、string型の配列をobject型に代入しても問題ありません。これを共変性と言います。このIEnumarableインターフェースクラスを含むいくつかのインターフェースに共変性があるので使用することができるというわけです。

そしてデリゲートFuncとActionには共変性と反変性が備わっています。Funcを使って実際にみてみましょう

f:id:covory10101101276:20180204002133p:plain

f:id:covory10101101276:20180204002647p:plain

Func デリゲートクラスはその後に<パラメータ, 戻り値>と入力することで生成したクラスに指定した戻り値を備えることができるクラスです。つまり、7行めではobject型のパラメータを持つBrunoクラスにobject型を代入しているので問題ありませんが、11行めではstring型のFuncクラスmd2にobject型のmd1クラスを代入しているのです。objectは派生元ですがその派生先であるstring型には代入できるようです。これが反変性なのです。

つまり、わかりやすくいうと、

派生先 → 派生元 への代入は共変性を持っているクラスに可能

派生元 → 派生先 への代入は反変性を持っているクラスに可能

 

ということになります。

あれ、これもジェネリック関係ない....???

とにかく、以上で今回は終わります。

 

ついにジェネリック編が終わりました。残すところも後わずか。このC#を一通り終えたら、早くUnityで実際にゲームを作り始めてみたいです!!

 

テストが終わってスマブラディシディアFF12MHWもあるのですがこっちの勉強もしたいし....あーーー時間が足りない!!