为什么我需要实现IComparable <t>来比较泛型方法中的两个值?</t>

时间:2014-08-12 08:27:28

标签: c# generics comparison

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

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

我认为应该添加IComparable约束,以使其有效(可能CompareTo而不是==。使用class约束时,将比较引用。使用struct约束时,不允许进行比较,也不允许进行约束。

在传递对象的情况下,是否可以解析给定类型和比较引用,并在传递值类型时比较值?

1 个答案:

答案 0 :(得分:5)

language specification中有一条评论。

看看第7.10.6段:

  

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

结构无法与==进行比较,因为没有为每个值类型定义此运算符。

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

所以设计不可能。为什么?

这很有道理。 Intuition告诉我们应该按值比较值类型。因此,如果两个值类型变量具有相同的内容,则它们是相等的。虽然结构是一团数据,但它可能包含对象的引用。如果这个引用不同但具有相同的值,那么这种比较的结果应该是什么?

例如:

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.Equalsobject.Equals重载,试图解决此问题。它尽可能执行值比较,而不执行参考比较。但是你必须记住,它使结构变得臃肿。您对每个结构都有默认操作,可能需要很长时间才能完成。所以它有可能,但不是结构本身的功能。

相关问题