Маркер ==
в C # используется для двух разных операторов проверки равенства. Когда компилятор встречает этот токен, он проверяет, осуществил ли какой-либо из сравниваемых типов перегрузку оператора равенства или для сравнения отдельных типов комбинации (*), или для комбинации типов, к которым могут быть преобразованы оба типа. Если компилятор найдет такую перегрузку, он будет использовать его. В противном случае, если оба типа являются ссылочными типами, и они не являются несвязанными классами (либо они могут быть интерфейсом, либо они могут быть связанными классами), компилятор будет рассматривать ==
как оператор сравнения ссылок. Если ни одно из условий не применяется, компиляция не будет выполнена.
Обратите внимание, что некоторые другие языки используют отдельные токены для двух операторов проверки равенства. Например, в VB.NET токен =
используется в выражениях исключительно для перегружаемого оператора проверки равенства, а Is
используется в качестве оператора эталонного теста или нулевого теста. An использовать =
для типа, который не переопределяет оператор проверки равенства, не будет работать, как будет пытаться использовать Is
для любых целей, кроме проверки ссылочного равенства или недействительности.
(*) Типы обычно только перегружают равенство для сравнения с самим собой, но может быть полезно, чтобы типы перегружали оператор равенства для сравнения с другими конкретными типами; например, int
мог бы (и IMHO должен был иметь, но не сделал) определил операторы равенства для сравнения с float
, так что 16777217 не сообщил бы себя равным 16777216f. Как бы то ни было, поскольку такой оператор не определен, C # будет продвигать int
до float
, округляя его до 16777216f, прежде чем оператор проверки равенства увидит его; этот оператор затем видит два равных числа с плавающей запятой и сообщает о них как о равных, не подозревая о округлении, которое имело место.