我想知道为什么像这样的代码不能工作:
public static bool cmp <T> (T a, T b)
{
return a == b;
}
我认为应该添加IComparable
约束,以使其有效(可能CompareTo
而不是==
。使用class
约束时,将比较引用。使用struct
约束时,不允许进行比较,也不允许进行约束。
在传递对象的情况下,是否可以解析给定类型和比较引用,并在传递值类型时比较值?
答案 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.Equals从object.Equals
重载,试图解决此问题。它尽可能执行值比较,而不执行参考比较。但是你必须记住,它使结构变得臃肿。您对每个结构都有默认操作,可能需要很长时间才能完成。所以它有可能,但不是结构本身的功能。