Jon Jagger
jon@jaggersoft.com
Table of Contents 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 Notes DownloadECMA-334 C# Language Specificationpreviousnextprevious at this levelnext at this level 14 Expressionsprevious at this levelnext at this level 14.9 Relational and type-testing operatorsprevious at this levelnext at this level 14.9.6 Reference type equality operators Paragraph 11 The predefined reference type equality operators are:
bool operator ==(object x, object y);  
bool operator !=(object x, object y);  
Paragraph 21 The operators return the result of comparing the two references for equality or non-equality. Paragraph 31 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. 2 Conversely, any applicable user-defined equality operators effectively hide the predefined reference type equality operators. Paragraph 41 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. 2 Unless both of these conditions are true, a compile-time error occurs. [Note: Notable implications of these rules are: Paragraph 51 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. 2 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. [Example: The example
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);  
   }  
}  
produces the output
True  
False  
False  
False  
The s and t variables refer to two distinct string instances containing the same characters. The first comparison outputs True because the predefined string equality operator (§14.9.7) is selected when both operands are of type string. The remaining comparisons all output False because the predefined reference type equality operator is selected when one or both of the operands are of type object. Note that the above technique is not meaningful for value types. The example
class Test  
{  
   static void Main() {  
      int i = 123;  
      int j = 123;  
      System.Console.WriteLine((object)i == (object)j);  
   }  
}  
outputs False because the casts create references to two separate instances of boxed int values. end example]
{ JSL }
Jagger Software Ltd
Company # 4070126
VAT # 762 5213 42
Valid HTML 4.01Valid CSS