相关疑难解决方法(0)

C#中基于接口的编程的运算符重载

背景

我在当前项目中使用基于接口的编程,并在重载运算符(特别是Equality和Inequality运算符)时遇到问题.


假设

  • 我正在使用C#3.0,.NET 3.5和Visual Studio 2008

更新 - 以下假设是错误的!

  • 要求所有比较使用Equals而不是operator ==不是一个可行的解决方案,尤其是在将类型传递给库(例如Collections)时.

我担心要求使用Equals而不是operator ==的原因是我在.NET指南中找不到任何地方,它声称它会使用Equals而不是operator ==甚至建议它.但是,重新阅读覆盖等于和操作员指南==我发现了这个:

默认情况下,operator ==通过确定两个引用是否指示同一对象来测试引用相等性.因此,引用类型不必实现operator ==以获得此功能.当一个类型是不可变的,也就是说,实例中包含的数据不能改变时,重载operator ==来比较值的相等而不是引用相等可能是有用的,因为作为不可变对象,它们可以被认为是相同的因为它们具有相同的价值.在非不可变类型中覆盖operator ==不是一个好主意.

和这个Equatable接口

当在Contains,IndexOf,LastIndexOf和Remove等方法中测试相等性时,IEquatable接口由泛型集合对象(如Dictionary,List和LinkedList)使用.它应该针对可能存储在泛型集合中的任何对象实现.


约束上

  • 任何解决方案都不能要求将对象从其接口转换为其具体类型.

问题

  • 当operator ==的两边都是接口时,底层具体类型的operator == overload方法签名都不匹配,因此将调用默认的Object operator ==方法.
  • 在类上重载运算符时,二元运算符的至少一个参数必须是包含类型,否则会生成编译器错误(错误BC33021 http://msdn.microsoft.com/en-us/library/watt39ff .aspx)
  • 无法在接口上指定实现

请参阅下面的代码和输出,以说明问题.


在使用基于接口的编程时,如何为类提供适当的操作符重载?


参考

==运算符(C#参考)

对于预定义的值类型,如果操作数的值相等,则相等运算符(==)返回true,否则返回false.对于除string之外的引用类型,如果其两个操作数引用同一对象,则==返回true.对于字符串类型,==比较字符串的值.


也可以看看


using System;

namespace OperatorOverloadsWithInterfaces
{
    public interface IAddress : IEquatable<IAddress>
    {
        string StreetName { get; set; }
        string City { get; set; }
        string State { get; set; }
    }

    public …
Run Code Online (Sandbox Code Playgroud)

.net c# equals operator-overloading

72
推荐指数
1
解决办法
2万
查看次数

重载运算符==与Equals()

我正在开发一个C#项目,直到现在,我已经使用了不可变对象和工厂来确保Foo始终可以比较类型对象的相等性==.

Foo创建后无法更改对象,并且工厂始终为给定的参数集返回相同的对象.这很好用,在整个代码库中我们假设它==始终用于检查相等性.

现在我需要添加一些引入边缘情况的功能,但这并不总是有效.最简单的方法是operator ==为该类型重载,以便项目中的其他代码都不需要更改.但这让我感觉像代码味道:重载operator ==并且Equals不仅仅是看起来很奇怪,而且我习惯于==检查引用相等性的约定,并Equals检查对象的相等性(或任何术语).

这是一个合理的问题,还是我应该继续超载operator ==

c# equals operator-overloading

44
推荐指数
6
解决办法
3万
查看次数

标签 统计

c# ×2

equals ×2

operator-overloading ×2

.net ×1