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约束时,不允许进行比较,也不进行约束.
在传递对象时是否可以解析给定类型和比较引用,并在传递值类型时比较值?
语言规范中有一个注释.
看一下第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,试图解决这个问题.它尽可能执行值比较,而不执行参考比较.但是你必须记住,它使结构变得臃肿.您对每个结构都有默认操作,可能需要很长时间才能完成.所以它有可能,但不是结构的功能本身.