C# 在关于Equals override的msdn指南中,为什么在null检查中强制转换为对象?
我只是在看(见下面的代码);大部分对我来说都很清楚,但有一句话我不明白C# 在关于Equals override的msdn指南中,为什么在null检查中强制转换为对象?,c#,operator-overloading,C#,Operator Overloading,我只是在看(见下面的代码);大部分对我来说都很清楚,但有一句话我不明白 if ((System.Object)p == null) 或者,在第二个覆盖中 if ((object)p == null) 为什么不简单 if (p == null) 我们的演员阵容是什么? public override bool Equals(System.Object obj) { // If parameter is null return false. if (obj == null)
if ((System.Object)p == null)
或者,在第二个覆盖中
if ((object)p == null)
为什么不简单
if (p == null)
我们的演员阵容是什么?
public override bool Equals(System.Object obj)
{
// If parameter is null return false.
if (obj == null)
{
return false;
}
// If parameter cannot be cast to Point return false.
TwoDPoint p = obj as TwoDPoint;
if ((System.Object)p == null)
{
return false;
}
// Return true if the fields match:
return (x == p.x) && (y == p.y);
}
public bool Equals(TwoDPoint p)
{
// If parameter is null return false:
if ((object)p == null)
{
return false;
}
// Return true if the fields match:
return (x == p.x) && (y == p.y);
}
我想,由于本文还讨论了重写运算符==,它迫使它使用对象上定义的==运算符,而不是当前类中任何重载的运算符。可以重写
=
运算符,如果是,则默认的引用比较可能不是您得到的。强制转换到System.Object可确保调用==
执行引用相等性测试
public static bool operator ==(MyObj a, MyObj b)
{
// don't do this!
return true;
}
...
MyObj a = new MyObj();
MyObj b = null;
Console.WriteLine(a == b); // prints true
Console.WriteLine((object)a == (object)b); // prints false
我更喜欢在这个模棱两可的上下文中使用
object.ReferenceEquals(a,b)
来强制进行引用比较,因为它在准确保留语义的同时明确了意图(事实上,ReferenceEquals
就是这样实现的)