Pap*_*ome 5 c# generics nunit interface .net-4.0
我想要一个通用类来实现 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;
}
}
Run Code Online (Sandbox Code Playgroud)
问题就在这里。当我编译上面的泛型类时,我收到以下消息。
“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>
{
Run Code Online (Sandbox Code Playgroud)
上面的代码可以工作,但是 的实例V<T>不再被识别为 IEquitable
注2:感谢 dasblinkenlight 在自己的解决方案中尝试此代码,我发现这很可能是配置问题而不是编码问题。我现在认为这个具体问题已得到解答,但我尚未确定我的配置问题。
注3:问题的实际原因是NUnit测试模块通过访问器加载dll。需要更改测试程序,但IEquatable<V<T>>现在使用没有任何问题。
问题解决了。
您的通用类没有任何问题。您作为泛型参数传递的类有问题T。即,SomeClass您传入的类V<SomeClass>未实现IEquitable<SomeClass>.
您的V<T>类需要T是IEquitable<T>. 您需要它才能使用表达式检查数组的元素是否相等Value[i].Equals(other.Value[i])。如果您用作V<T>泛型参数的任何类与其自身不相等,编译器会抱怨。