为什么我需要实现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的情况下,不可能解析给定的类型并比较引用,并在传递值类型时比较值吗?
语言规范中有一个注释。
看一下第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
重载,试图解决这个问题。它在可能的地方执行值比较,在不可能的地方执行引用比较。但你必须记住,它使结构体有点臃肿。在每个结构体上都有默认操作,这可能需要很长时间才能完成。所以这是可能的,但不是作为结构本身的功能。