14.9.6 Reference type equality operators

本文详细介绍了预定义引用类型相等性运算符的定义与使用规则,包括bool operator==(object x, object y)及bool operator!=(object x, object y)。这些运算符用于比较两个引用类型的相等性和不相等性。文章还探讨了当操作数为object类型时这些运算符的应用范围,以及如何通过显式转换来选择预定义引用类型相等性运算符。
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 (?
3.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. [Note: Notable implications of these rules are:
?It is a compile-time error to use the predefined reference type equality
operators to compare two
references that are known to be different at compile-time. [Example: For
example, if the compile-time
types of the operands are two class types A and B, and if neither A nor B
derives from the other, then it
would be impossible for the two operands to reference the same object.
Thus, the operation is considered
a compile-time error. end example]
?The predefined reference type equality operators do not permit value type
operands to be compared.
Therefore, unless a struct type declares its own equality operators, it is
not possible to compare values of
that struct type.
?The predefined reference type equality operators never cause boxing
operations to occur for their
operands. It would be meaningless to perform such boxing operations, since
references to the newly
allocated boxed instances would necessarily differ from all other
references.
end note]
For an operation of the form x == y or x != y, if any applicable operator
== or operator != exists,
the operator overload resolution (?4.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.
[Example: The example
Chapter 14 Expressions
167
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 (?4.
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]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值