ECMA-334 C# Language Specification14.9.6: Reference type equality operators |
The predefined reference type equality operators are:
bool operator ==(object x, object y); bool operator !=(object x, object y); |
The operators return the result of comparing the two references for equality or non-equality.
Since the predefined reference type equality operators accept operands of type object, they apply to all types that do not declare applicable operator == and operator != members. Conversely, any applicable user-defined equality operators effectively hide the predefined reference type equality operators.
The predefined reference type equality operators require the operands to be reference-type
values or the value null; furthermore, they require that a standard implicit conversion (13.3.1) exists from the type of either operand to the type of the other operand. Unless both of these conditions are true, a compile-time error occurs.
For an operation of the form x == y or x != y, if any applicable operator == or operator != exists, the operator overload resolution (14.2.4) rules will select that operator instead of the predefined reference type equality operator. However, it is always possible to select the predefined reference type equality operator by explicitly casting one or both of the operands to type object.
produces the output
using System;
class Test
{
static void Main() {
string s = "Test";
string t = string.Copy(s);
Console.WriteLine(s == t);
Console.WriteLine((object)s == t);
Console.WriteLine(s == (object)t);
Console.WriteLine((object)s == (object)t);
}
}
True
False
False
False
outputs False because the casts create references to two separate instances of boxed int values. end example]
class Test
{
static void Main() {
int i = 123;
int j = 123;
System.Console.WriteLine((object)i == (object)j);
}
}