1

我正在使用 List.Contains 来判断变量是否在列表中,但它会不断返回它不在的时候。

我查阅了MSDN,发现我必须继承 IEquatable 并实现我自己的 .Equals 方法。实际的类是从另一个类继承的,所以我在基类中编写了 .Equals 方法。

这是“Actividad”类的代码:

abstract public class Actividad:IEquatable<Actividad> {

    protected int codigo;

    [...]

    public bool  Equals(Actividad otra)
    {
        return this.Codigo == otra.Codigo;
    }   
}

这是子类“Actividad_a”的定义:

public class Actividad_a : Actividad{ [...] }

这是检查列表中是否有内容的代码:

private void loadDisponibles() {

    foreach (Actividad_a act in Program.Asignaturas) {

        if (!user1.ActAcademicas.Contains(act)) {
           doSomething();
        }
    }
}

Program.Asignaturas并且user1.ActAcademicas都定义为List<Actividad_a>

问题是!user1.ActAcademicas.Contains(act)无论数据是否在列表中,它总是返回 true。

我的第一个猜测是我必须从 IEquatable 继承并在每个派生类中实现 .Equals 方法,但我不太确定。

4

1 回答 1

3

您正在比较 Actividad_a 并且 Contains 方法期望它实现IEquatable<Actividad_a>而不是IEquatable<Actividad>

尝试覆盖默认的 Equals 方法

public override bool Equals(object otra)
{
    var actividad = otra as Actividad;
    if (actividad == null) return false;
    return this.Codigo == actividad.Codigo;
}   

编辑:

更多信息:.NET 4.0 引入了使用称为逆变和协方差的泛型的灵活性http://msdn.microsoft.com/en-us/library/dd799517.aspx

协变和逆变泛型类型参数在分配和使用泛型类型方面提供了更大的灵活性。例如,协变类型参数使您能够进行看起来很像普通多态性的赋值。假设您有一个基类和一个派生类,分别命名为 Base 和 Derived。多态性使您能够将 Derived 的实例分配给 Base 类型的变量。同样,因为 IEnumerable(Of T) 接口的类型参数是协变的,所以可以将 IEnumerable 的实例(Visual Basic 中的 IEnumerable(Of Derived))赋值给 IEnumerable 类型的变量

一般来说,协变类型参数可以作为委托的返回类型,逆变类型参数可以作为参数类型。对于接口,协变类型参数可以作为接口方法的返回类型,逆变类型参数可以作为接口方法的参数类型。

出于某种原因IEquatable<T> ,没有进行逆变,为什么您的原始方法不起作用

于 2012-04-16T22:18:58.463 回答