【发布时间】:2010-12-01 18:26:49
【问题描述】:
我看到在 .NET 4.0 的两个新 Tuple 实例之间使用 .Equals 和 == 之间的不同行为。如果我在 Tuple 中的对象上覆盖了 Equals 并在 Tuple 上调用 .Equals ,则将调用 Equals 的覆盖。如果我在元组上使用 ==,则不会调用 Equals 的覆盖。这是设计使然吗?是否有意义?
编辑:从答案和 cmets 我可以看出我不清楚。我知道 Tuple 是一个引用类型,对于引用类型 == 将检查身份(ReferenceEquals)。但是,是否应该 Tuple 覆盖 == 来检查它包含的对象的相等性?为了一致性,可能不会。
例如,如果我有一个简单的对象
public class NameAndNumber
{
public int Number { get; set; }
public string Name { get; set; }
public override bool Equals(object obj)
{
if (obj is NameAndNumber)
{
NameAndNumber other = (NameAndNumber)obj;
return Number == other.Number && Name == other.Name;
}
return false;
}
}
然后我做这样的事情:
Tuple<NameAndNumber, NameAndNumber> left = new Tuple<NameAndNumber, NameAndNumber>(
new NameAndNumber { Name = "one", Number = 1 },
new NameAndNumber { Name = "two", Number = 2 });
Tuple<NameAndNumber, NameAndNumber> right = new Tuple<NameAndNumber, NameAndNumber>(
new NameAndNumber { Name = "one", Number = 1 },
new NameAndNumber { Name = "two", Number = 2 });
bool operatorResult = left == right;
bool equalsResult = left.Equals(right);
Console.Out.WriteLine("operatorResult = {0} equalsResult = {1}",
operatorResult, equalsResult);
我得到 operatorResult = false equalsResult = true
我应该期待吗?
我知道 NameAndNumber 上的 Equals 实现并不“正确”,它只是简化的示例代码。
我也尝试过实现 IEquatable、==、!= 和 GetHashCode。结果相同。
【问题讨论】:
-
感谢您的回答和 cmets。我应该预料到这种行为。我正在用 .NET 4 实现替换我们自己编写的项目 3.5 Tuple 实现。我们的元组覆盖 == 以获得我在问题中预期的行为。因此,当它的行为与我们自定义的不完全一样时,我感到很惊讶。