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.Asignaturasuser1.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では、ContravarianceおよびCovarianceと呼ばれるジェネリックを操作するための柔軟性が導入されました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 に答える