在这篇文章中,Eric Lippert在第9点中指出C#有“过多的相等性”。他指出,有9或10种不同的方法或运算符可以重载以提供对象相等性。
我的第一个问题是 - 如果Object.Equals(object)方法被覆盖,编译器是否可以调用任何其他相等运算符,如==,!=,<=等,而不需要明确执行此操作的代码?
在C ++中,存在这种行为的先例。复制构造函数可以在编译器需要生成临时变量的某些地方调用。我至少95%确定这在C#中不可能发生,但它确实取决于编译器的构造方式,以及可能的边缘情况。
第二个问题是——如果编译器永远不会间接调用任何等式运算符,那么对于小型、中型甚至大型项目来说,是否可以指定仅使用 Object.Equals(object) 方法和 IEquatable 进行相等性测试,并在需要确定对象排名时使用 IComparable?换句话说,如果项目中的所有人都同意不使用其他等式运算符并且因此不必要,那么避免定义其他等式运算符是否可以?假设代码仅在项目内部使用,不会导出供第三方使用。
我的第一个问题是 - 如果Object.Equals(object)方法被覆盖,编译器是否可以调用任何其他相等运算符,如==,!=,<=等,而不需要明确执行此操作的代码?
在C ++中,存在这种行为的先例。复制构造函数可以在编译器需要生成临时变量的某些地方调用。我至少95%确定这在C#中不可能发生,但它确实取决于编译器的构造方式,以及可能的边缘情况。
第二个问题是——如果编译器永远不会间接调用任何等式运算符,那么对于小型、中型甚至大型项目来说,是否可以指定仅使用 Object.Equals(object) 方法和 IEquatable 进行相等性测试,并在需要确定对象排名时使用 IComparable?换句话说,如果项目中的所有人都同意不使用其他等式运算符并且因此不必要,那么避免定义其他等式运算符是否可以?假设代码仅在项目内部使用,不会导出供第三方使用。