.net-4.0 - 这是预期的 C# 4.0 元组相等行为吗?

标签 .net-4.0 c#-4.0 tuples

我看到在 .NET 4.0 的两个新 Tuple<> 实例之间使用 .Equals 和 == 之间存在不同的行为。如果我在 Tuple<> 中的对象上覆盖了 Equals 并在 Tuple 上调用 .Equals ,则将调用 Equals 的覆盖。如果我在元组上使用 ==,则不会调用 Equals 的覆盖。这是设计使然吗?有意义吗?

编辑:从答案和评论中,我可以说我不清楚。我知道 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。结果相同。

最佳答案

您看到的结果来自 design compromise , 元组现在在 F# 和 C# 之间共享。重点是所有元组确实都实现为引用类型,这并不那么明显。

Tuples 是否应该进行深或浅相等检查的决定已移至两个接口(interface):IStructuralComparable , IStructuralEquatable .请注意,这两个现在也由 Array 类实现。

关于.net-4.0 - 这是预期的 C# 4.0 元组相等行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1483059/

相关文章:

wpf - 样式 TargetType 在未附加到调试器时会导致 XamlParseException

c# - 神秘消失的引用资料

c# - 异步拖放到 Windows 资源管理器

C++14 auto lambda 可以接受 Obj<std::tuple<void>>——但模板函数不能?

python - 如何排列元组列表,以便删除与其他元组相比具有最高值的元组并返回最大值

.net - 为什么 VBA 的 VarType 函数说这个 COM 对象是一个字符串? (Object 是 .NET 的 System.Object 类的 COM 版本的实例。)这是一个错误吗?

c# - 如何在 Aspose.Words 中插入自定义页码

c#-4.0 - 递归检查 Active Directory 组成员身份

javascript - 如何在页面加载和自动点击时获取警报消息内容

python - 计算给定元组列表的每个平均值