泛型类和IEquatable问题

时间:2013-02-09 11:38:09

标签: c# generics .net-4.0 interface nunit

我想要一个泛型类来实现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;
    }
}

这就是问题所在。 当我编译上面的泛型类时,我得到以下消息。

  

'Myspace.Generic.V`1 [T]'上的GenericArguments [0],'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>>没有任何问题。

解决了问题。

1 个答案:

答案 0 :(得分:2)

您的泛型类没有任何问题。您作为通用参数T传递的类有问题。即SomeClass,您在V<SomeClass>中传递的课程未实现IEquitable<SomeClass>

您的V<T>课程要求T成为IEquitable<T>的实施。您需要它才能使用Value[i].Equals(other.Value[i])表达式检查数组的逐个元素相等性。如果你用作V<T>的泛型参数的类不适合自己,那么编译器就会抱怨。