在关于 Equals override 的 msdn 指南中,为什么在空检查中强制转换为对象?
我只是在查看 重载 Equals() 的指南msdn(参见下面的代码);大部分内容我都清楚,但有一行我不明白。
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);
}
I was just looking at the Guidelines for Overloading Equals() on msdn (see code below); most of it is clear to me, but there is one line I don't get.
if ((System.Object)p == null)
or, in the second override
if ((object)p == null)
Why not simply
if (p == null)
What is the cast to object buying us?
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);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
==
运算符可能会被覆盖,如果是的话,默认的引用比较可能不是您得到的。转换为 System.Object 可确保调用==
执行引用相等性测试。The
==
operator may be overridden, and if it is, the default reference comparison may not be what you get. Casting to System.Object ensures that calling==
performs a reference equality test.我更喜欢在这种不明确的上下文中使用 object.ReferenceEquals(a, b) 来强制进行引用比较,因为它可以使意图清晰,同时精确地保留语义(事实上,
>ReferenceEquals
就是这样实现的)。I prefer using
object.ReferenceEquals(a, b)
in this ambiguous context to force reference comparison because it makes the intent clear while preserving the semantics precisely (in fact,ReferenceEquals
is implemented like that).我想,由于本文还讨论了重写运算符 ==,因此它强制它使用在 Object 上定义的 == 运算符,而不是当前类中的任何重载运算符。
I suppose, since the article also talks about overriding operator==, that it's forcing it to use the == operator defined on Object rather than any overloaded operator in the current class.