重写的运算符不起作用

overrided operator doesn't work

我已经创建了自定义链表 class。在这个 class 我有

public bool Contains( Object obj )
        {
            for( Node curr = Start; curr != null; curr = curr.Next)
            {
                if( curr.Data == obj )
                    return true;
            }
            return false;
        }

在 Workman.cs 中我重写了 == 运算符:

class Workman
    {
        public DateTime Date { get; set; }
        public string LastName { get; set; }
        public string PartCode { get; set; }
        public int PartCount { get; set; }

        public int DaysWorked { get; set; }
        public int PartsMade { get; set; }
        public double PriceSum { get; set; }

        public Workman(DateTime date, string lastName, string partCode, int partCount)
        {
            Date = date;
            LastName = lastName;
            PartCode = partCode;
            PartCount = partCount;
        }

        public Workman() { }

        public override string ToString ()
        {
            return string.Format ("[Workman: LastName={0}, PartCode={1}, PartCount={2}", LastName, PartCode, PartCount);
        }

        public override bool Equals (object obj)
        {
            return this.Equals (obj as Workman);
        }

        public bool Equals(Workman workman)
        {
            if(Object.ReferenceEquals(workman, null))
                return false;
            if(this.GetType() != workman.GetType())
                return false;
            return (LastName == workman.LastName);
        }

        public override int GetHashCode()
        {
            return LastName.GetHashCode();
        }

        public static bool operator ==(Workman lhs, Workman rhs)
        {
            if(Object.ReferenceEquals(lhs, null))
            {
                if(Object.ReferenceEquals(rhs, null))
                {
                    return true;
                }
                return false;
            }
            return lhs.Equals(rhs);
        }

        public static bool operator !=(Workman lhs, Workman rhs)
        {
            return !(lhs == rhs);
        }
    }

现在主要我有:

LinkedList test = new LinkedList();
test.Add2( new Workman(new DateTime(), "John", "whatever", 45));
test.Add2( new Workman(new DateTime(), "Mike", "bb", 45));

Workman work = new Workman( new DateTime(), "Mike", "bb", 45 );

if( test.Contains( work ))
{
    Console.WriteLine("Contains");
}

这行不通。当我尝试调试时,Linkedlist.cs class if( curr.Data == obj) 中的行没有在 Workman.cs 中输入覆盖代码。我怎样才能使这项工作?

您不能覆盖 操作符,您只能重载 它们。您正在使用 object 参数调用 == 运算符重载,而不是使用 Workman 参数调用新的重载。

我建议您改用 object.Equals,因为您已经覆盖了

if(Equals(cur.Data, obj)
{
    return true;
}

我认为如果您添加演员表,它会为您工作,因为现在您正在对对象调用 ==。 我相信这会奏效:

public bool Contains( Object obj )
        {
            for( Node curr = Start; curr != null; curr = curr.Next)
            {
               if(curr.data is workman && obj is workman)
                {
                    if((workman)curr.data == (workman)obj )
                    {
                        return true;
                    }
                    else
                    {
                     return false;
                    }
                }
               if( curr.Data == obj )
               {
                   return true;
               }
            }
            return false;
        }

我不是 100% 确定,如果对您有帮助,请告诉我。 谢谢。