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

Bar*_*icz 5 c# generics comparison

我想知道为什么这样的代码不起作用:

public static bool cmp <T> (T a, T b)
{
    return a == b;
}
Run Code Online (Sandbox Code Playgroud)

我假设,应该IComparable添加一个约束,使它工作(也许CompareTo不是==这样).有class约束,将比较参考.使用struct约束时,不允许进行比较,也不进行约束.

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

Pio*_*fer 5

语言规范中有一个注释.

看一下第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);
Run Code Online (Sandbox Code Playgroud)

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

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