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], 'T' on 'Myspace.Generic.V`1[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:问题的实际原因是一个NUnit测试模块通过访问器加载了dll。需要更改测试程序,但IEquatable<V<T>>现在使用没有任何问题。

问题解决了。

4

1 回答 1

2

您的泛型类没有任何问题。您作为其泛型参数传递的类有问题T。即,SomeClass您传入的类V<SomeClass>没有实现IEquitable<SomeClass>

Your V<T> class requires T to be an implementation of IEquitable<T>. You need it in order to check element-by-element equality of arrays using the Value[i].Equals(other.Value[i]) expression. If whatever class that you use as V<T>'s generic parameter is not equitable to itself, the compiler would complain.

于 2013-02-09T11:41:21.313 回答