C#如何在泛型父类中调用重载运算符?

C#如何在泛型父类中调用重载运算符?,c#,.net,inheritance,C#,.net,Inheritance,以下问题: 在泛型父类ParentA的函数定义中,我想从ChildB调用重载运算符: 请参见以下结构 class ParentA<T> where T : ParentB { public bool Contains(T element) { T element2; return element==element2; } } class ChildB : ParentB { public static b

以下问题: 在泛型父类ParentA的函数定义中,我想从ChildB调用重载运算符:

请参见以下结构

class ParentA<T> where T : ParentB
{
    public bool Contains(T element)
    {
             T element2;
         return element==element2;
    }
}

class ChildB : ParentB
{
     public static bool operator ==(ChildB s1, ChildB s2)
     {
      //this one should be used
     }
}


ChildA :ParentA<ChildB>
{
//make use of inherited function Contains(ChildB element)
}


现在看来,它真的做到了。我只是不明白为什么…

您能显示试图使用重载运算符的代码吗?还有ParentB类的代码?您是否试图以某种方式从基类调用
==
?我认为这不可能直接做到,但是您可以重写基类中的
Equals
,并从
=
操作符调用它,然后
base.Equals
应该可以工作。操作符方法是静态类型的,这就是为什么它们在编译时而不是运行时解析。因此,您需要在
ParentB
@user1672994中提供运算符的定义我应该如何在ParentB中定义一个作用于childB的运算符?只有在编译时知道您比较的两个对象都是ParentB类型时,才会调用您的==运算符。否则,操作员的签名将不匹配。如果你想让第二个参数是任何东西(比如在Equals中),你也必须给它类型object。你能展示一下试图使用重载操作符的代码吗?还有ParentB类的代码?您是否试图以某种方式从基类调用
==
?我认为这不可能直接做到,但是您可以重写基类中的
Equals
,并从
=
操作符调用它,然后
base.Equals
应该可以工作。操作符方法是静态类型的,这就是为什么它们在编译时而不是运行时解析。因此,您需要在
ParentB
@user1672994中提供运算符的定义我应该如何在ParentB中定义一个作用于childB的运算符?只有在编译时知道您比较的两个对象都是ParentB类型时,才会调用您的==运算符。否则,操作员的签名将不匹配。如果您想让第二个参数只是任何东西(比如Equals),那么您也必须给它类型object。
public abstract class ElementBase
{
    protected Element element;
    public Element Element
    {
        get { return element; }
        set { element = value; }
    }

    public static bool operator ==(ElementBase e1, ElementBase e2)
    {
        return e1.element == e2.element;
    }
    public static bool operator !=(ElementBase e1, ElementBase e2)
    {
        return e1.element != e2.element;
    }
    public override bool Equals(object obj)
    {
        if ((obj == null) || !this.GetType().Equals(obj.GetType()))
            return false;
        else
        {
            ElementBase element = (ElementBase)obj;
            return this == element;
        }
    }
}

public class Structure : ElementBase
{
    public bool flag;
    public static bool operator ==(Structure s1, Structure s2)
    {
        return s1.element == s2.element  && s1.flag==s2.flag;
    }
    public static bool operator !=(Structure s1, Structure s2)
    {
        return s1.element != s2.element || s1.flag!=s2.flag;
    }
    public override bool Equals(object obj)
    {
        if ((obj == null) || !this.GetType().Equals(obj.GetType()))
            return false;
        else
        {
            Structure structure = (Structure)obj;
            return this == structure;
        }
    }
}

public class MapBase<T> where T : ElementBase
{
    protected Dictionary<long, T> elements = new Dictionary<long, T>();
    public bool Contains(T element)
    {
        ...
        return element==elements[id];
    }
}

public class StructureMap : MapBase<Structure>
{
       void someFunction()
       {
            //make use of Contains(Structure element)
       }

}
return element==element2;
return element.Equals(element2);