gpt4 book ai didi

c# - 为什么我需要实现 IComparable 来比较泛型方法中的两个值?

转载 作者:太空狗 更新时间:2023-10-29 23:14:33 25 4
gpt4 key购买 nike

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

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

我假设,应该添加一个 IComparable 约束,以使其工作(也许 CompareTo 而不是 == ) .使用 class 约束,将比较引用。使用 struct 约束,不允许比较,也没有约束。

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

最佳答案

language specification中有备注.

看看第 7.10.6 段:

The predefined reference type equality operators do not permit value type operands to be compared. Therefore, unless a struct type declares its own equality operators, it is not possible to compare values of that struct type.

Structs 不能与== 进行比较,因为这个运算符并不是为每个值类型都定义的。

该标准明确提到了整数类型、 float 、小数、 bool 值和枚举,当然还有引用类型。

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

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

例如:

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 重载,试图解决这个问题。它在可能的情况下执行值比较,在不可能的情况下执行引用比较。但是您必须记住,它会使结构有点臃肿。您对每个结构都有一个默认操作,这可能需要很长时间才能完成。所以这是可能的,但不是作为结构的功能本身。

关于c# - 为什么我需要实现 IComparable<T> 来比较泛型方法中的两个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25259498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com