trsing’s diary

勉強、読んだ本、仕事で調べたこととかのメモ。

EFFECTIVE C# 6.0/7.0 読書メモ 項目26

項目26 ジェネリックインターフェイスとともに古いインターフェイスを実装すること

ジェネリックインターフェイスをサポートするクラスを作成するなら、非ジェネリックインターフェイスもサポートする。

ジェネリック以前のコードも多数存在しており、それらの古いコードを使用して新しいコードを作成しなければならないため。

例えば、IEnumerable<T>IEnumerableから派生しいる。ICollection<T>IList<T>ICollectionIListから派生していないが、IEnumerable<T>を継承している。

ジェネリックインターフェイスのサポート

ジェネリックインターフェイスをサポートするには、適切なシグネチャを持ったメソッドをクラス内に追加すればよい。

このとき、明示的に実装(int IComparable.CompareTo(object obj))すれば、非ジェネリックインターフェイスが意図せず呼ばれることがない。

その他

派生クラスとは比較したくない場合、as演算子ではなく型のチェックをする。

obj.GetType()==typeof(Name);//objがNameの派生クラスでもfalse
obj as Name;//objがNameの派生クラスの場合Name型の参照を返す
> public class Name { }
> public class Name2 : Name { }
> var nm2 = new Name2();
> var nm2nm = nm2 as Name;//nullにならない
> nm2nm.GetType()
[Submission#1+Name2]