不确定is
关键字,但我认为这两个关键字是相同的。谁能证实这一点?
public bool Equals(Object obj)
{
if (obj == null) return false;
MyType t = (MyType)obj;
if (t == null) return false;
return true;
}
另一个是......
public bool Equals(Object obj)
{
return obj is MyType;
}
答案 0 :(得分:4)
(MyType)
不是InvalidCastException
的实例,则转化为obj
会立即抛出MyType
。如果演员表失败,表达式将不会评估为null
。 as
运算符展示了您对该演员的期望。 My answer to another question更详细地讨论了这一点。
答案 1 :(得分:2)
他们不一样。如果obj
不是MyType
,则第一个版本会抛出异常,第二个版本会返回false
。
Equals()
的这种实现很奇怪。您确定要将MyType
的所有实例视为相等吗?
答案 2 :(得分:2)
在第一种方法中,冒着失败并抛出异常的风险。我认为您可能会混淆as
关键字,如果转换失败则返回null
。一旦修复,方法将大致相同:
public bool Equals(Object obj)
{
return (obj as MyType) != null;
}
但无论如何后者更简洁明了。
答案 3 :(得分:1)
不一样,如果传递了不相关类型的对象,则第一个版本会发生InvalidCastException炸弹。
Equals()应该测试值的相等性,而不是类型相等。
答案 4 :(得分:1)
如果同时满足以下两个条件,则表达式的计算结果为true 满足:
表达式不为空。
表达式可以转换为类型。
也就是说,形式(类型)(表达式)的强制转换表达式将完成 抛出一个例外。有关更多信息,请参阅7.6.6 Cast 表达式。如果表达式将发出编译时警告 表达式是已知类型始终为true或始终为false。
方法不一样。如果obj
不属于MyType
,则会在is
不会引发异常,但会返回false
。