問題 §
C#で以下のコードがコンパイルできない。
- void Compare<T>(T x, T y) { return x == y; }
原因 §
==演算子はデフォルトで参照型を比較することしかできない。型情報を参照できる場合は、それによって比較可能になる場合もあるが、型引数経由ではその情報が得られない。
解決 §
参照型を扱うだけで良ければ、以下のように制約を付けることでコンパイル可能になる。
- bool Compare<T>(T x, T y) where T : class { return x == y; }
参考 §
Can't operator == be applied to generic types in C#?
感想 §
「C#も意外とつまらない場所でまだ隙があるな、と思った」
「汎用性を意識すると意外と面倒くさい問題に巻き込まれるわけだね」
「まあ、型引数はそれほど出番がないから何とでもなると言えばなるけどね」