C# 通过比较自定义类型==

C# 通过比较自定义类型==,c#,.net,C#,.net,我很确定这是一个基本问题,但由于某些原因,我无法在谷歌上尽快找到它,所以我会在这里问它 我有一个MoneyType对象,它包含一个int(以美分为单位的值)和一个decimal(只是正常值) 此类型继承IComperable接口并可以进行比较,现在我在If语句中比较两个MoneyType: if (invoice.GrossAmount == invoice.NetAmount) { //Something } 现在,我应该重写什么方法,或者我应该继承什么接口来让它工作?因为这样做不会进入C

我很确定这是一个基本问题,但由于某些原因,我无法在谷歌上尽快找到它,所以我会在这里问它

我有一个MoneyType对象,它包含一个int(以美分为单位的值)和一个decimal(只是正常值)

此类型继承IComperable接口并可以进行比较,现在我在If语句中比较两个MoneyType:

if (invoice.GrossAmount == invoice.NetAmount)
{
 //Something
}

现在,我应该重写什么方法,或者我应该继承什么接口来让它工作?因为这样做不会进入CompareTo()方法,也不会进入.Equals方法,所以我在atm上无所适从。

如果实现
IComparable
,那么实现
CompareTo
方法就比实现
。基于此实现,测试两个量是否相等,如下所示:

if (invoice.GrossAmount.CompareTo(invoice.NetAmount) == 0)//the $ame amount of money
{..}
直接与“==”进行比较意味着如前所述重载“==”运算符。即在
MoneyType
类中添加以下方法:

public static bool operator ==(MoneyType x, MoneyType y) 
{
      return x.CompareTo(y.NetAmount) == 0;//make use of the working IComparable implementation
}
您还必须实现“!=”。您还应该实现Equals方法(只需调用==运算符)和
GetHashCode

嗯,,
Lucian

您必须覆盖
==
=运算符

public static bool operator ==(Invoice left, Invoice right)
{
    return Equals(left, right);
}

public static bool operator !=(Invoice left, Invoice right)
{
    return !Equals(left, right);
}
在对该类型的对象列表进行*排序*并且对它们进行*排序*不相等的情况下,实现
IComaprable

MSDN:

默认情况下,运算符==测试 通过确定参考等式 两个参考文献是否表示 同样的目标


要更改此设置,您必须重载==和!=接线员。您可以查看MSDN上的完整解释和示例。

您可以使用
if(invoice.GrossAmount.Equals(invoice.NetAmount))
,这是完全可以接受的。

尝试在MoneyType类中包含以下内容

        public static bool operator ==( MoneyType a, MoneyType b)
        {
            return a.cents == b.cents;
        }

        public static bool operator !=(MoneyType a, MoneyType b)
        {
            return a.cents != b.cents;
        }

不,正常情况下,只是我比较喜欢。现在正在尝试通用版本(我不知道它存在)。编辑:无骰子:(你是对的,但有一件事我想知道,如果你做>=比较,它是使用CompareTo还是我也需要在那里定义运算符。我自己检查过,如果我想使用>,它也需要覆盖其他运算符,不,它不使用此运算符。没有内部接线确保这种行为。请查看并查看final注释:“注意,如果重载,比较运算符必须成对重载;也就是说,如果==重载,!=也必须重载。反之亦然,与<和>、for=类似。”