次のタイプを検討してください。
class A { }
class B { }
interface IC { }
A a = null; // the value doesn't matter - null or anything else, for all three
B b = null;
IC c = null;
var x = a == b;
しかし、以下はコンパイルされます(私が発見して驚いたように):
var x = a == c;
私が理解しているように、コンパイラはデフォルトの == 演算子を使用するようにフォールバックします。これはオブジェクトで定義されているため、引数に任意の型を受け入れます。IL は次のようになります ( の詳細は無視してくださいldfld
)。
ldarg.0
ldfld class A a
ldarg.0
ldfld class IC c
ceq
stloc.0
つまり、参照の等価性を使用します。
私の質問:
言語設計の観点からすると、なぜこれが理にかなっているのですか? 私にはそうではなく、大きな落とし穴だと思います。
これが実際に落とし穴である場合、コード分析はそれについて警告するべきではないでしょうか? (いいえ-そうではありません)。ちなみにReSharperにはこの機能があるようです。