我想要一个泛型类来实现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>>
没有任何问题。
解决了问题。
答案 0 :(得分:2)
您的泛型类没有任何问题。您作为通用参数T
传递的类有问题。即SomeClass
,您在V<SomeClass>
中传递的课程未实现IEquitable<SomeClass>
。
您的V<T>
课程要求T
成为IEquitable<T>
的实施。您需要它才能使用Value[i].Equals(other.Value[i])
表达式检查数组的逐个元素相等性。如果你用作V<T>
的泛型参数的类不适合自己,那么编译器就会抱怨。