4

IEquatable<T> インターフェイスを実装するジェネリック クラスが必要です。クラスには T 型のデータ項目があります。ジェネリック クラスが同等であるためには、データ項目も同等である必要があります。

ここに私のジェネリッククラスがあります:

public class V<T> : IEquatable<V<T>> where T : IEquatable<T>
{
    public V(T[] Value)
    {
        this.Value = Value;
    }

    T[] Value { get; set; }

    public bool Equals(V<T> other)
    {
        if (Value.Count() != other.Value.Count()) return false;

        for (int i = 0; (i < Value.Count()) && i < other.Value.Count(); i++)
        {
            if (!Value[i].Equals(other.Value[i])) return false;
        }

        return true;
    }
}

そして、ここに問題があります。上記のジェネリック クラスをコンパイルすると、次のメッセージが表示されます。

GenericArguments[0]、'Myspace.Generic.V`1[T]' の 'T' は、型パラメーター 'T' の制約に違反しています。

推論のどこで間違いを犯したのか、またはジェネリック クラスの何が問題なのか?

注:IEquatable<V<T>>ジェネリック クラスとそのままのコードをpublic bool Equals(V<T> other)省略すると、ジェネリック クラスがコンパイルされ、使用可能になります。コンパイラによる IEquitable の検出を除きます。

public class V<T> where T : IEquatable<T>
{

上記のコードは機能しますが、 のインスタンスはV<T>IEquitable として認識されなくなりました

注 2: このコードを独自のソリューションで試してくれた dasblinkenlight に感謝します。コーディングの問題ではなく、構成の問題である可能性が高いことがわかりました。この特定の質問は回答済みと考えていますが、構成の問題をまだ特定していません。

注 3: この問題の実際の原因は、アクセサーを介して dll をロードする NUnit テスト モジュールにあります。テスト手順の変更が必要ですがIEquatable<V<T>>、問題なく使用できています。

問題が解決しました。

4

1 に答える 1

2

ジェネリック クラスに問題はありません。ジェネリック パラメータとして渡したクラスに問題がありますT。つまり、SomeClassを渡すクラスは をV<SomeClass>実装していませんIEquitable<SomeClass>

クラスはの実装であるV<T>必要があります。式を使用して配列の要素ごとの等価性をチェックするために必要です。のジェネリック パラメーターとして使用するクラスがそれ自体に公平でない場合、コンパイラは文句を言います。TIEquitable<T>Value[i].Equals(other.Value[i])V<T>

于 2013-02-09T11:41:21.313 に答える