为什么我需要实现icparable 在泛型方法中比较两个值

本文关键字:比较 两个 泛型方法 实现 icparable 为什么 | 更新日期: 2023-09-27 18:17:40

我想知道为什么这样的代码不会工作:

public static bool cmp <T> (T a, T b)
{
    return a == b;
}

我假设,应该有一个IComparable约束添加,使其工作(也许CompareTo而不是==)。在class约束下,对参考文献进行比较。对于struct约束,不允许比较,以及没有约束。

在传递object的情况下,不可能解析给定的类型并比较引用,并在传递值类型时比较值吗?

为什么我需要实现icparable <T>在泛型方法中比较两个值

语言规范中有一个注释。

看一下第7.10.6段:

预定义的引用类型相等操作符不允许比较值类型操作数。因此,除非结构类型声明了自己的相等操作符,否则不可能比较该结构类型的值。

Structs不能与==比较,因为该操作符不是为所有值类型定义的。

标准明确提到了整数类型、浮点数、小数、布尔值和枚举,当然还有引用类型。

所以这是不可能的设计。,为什么?

有意义。直觉告诉我们,值类型应该按值进行比较。因此,如果两个值类型变量具有相同的内容,则它们是相等的。虽然结构体是一组数据,但它可以包含对对象的引用。如果这些引用不同,但具有相同的值,那么这种比较的结果应该是什么?

例如:

public struct A
{
    public string S;
}
A a;
A b;
a.S = "Hello";
b.S = "Hello world".Split(' ')[0]; //to avoid reusing the same reference, probably ;]
var result = (a == b);

答案应该是什么?二进制,它们是不同的,但值是相同的。

总是有ValueType。等于,从object.Equals重载,试图解决这个问题。它在可能的地方执行值比较,在不可能的地方执行引用比较。但你必须记住,它使结构体有点臃肿。在每个结构体上都有默认操作,这可能需要很长时间才能完成。所以这是可能的,但不是作为结构本身的功能。