我想创建一个泛型类节点如下:
public class Node<T>
{
public Node<T> Next;
public Node<T> Previous;
T Content;
public Node<T>()
{
}
}在我的主要(或来自其他班级),我想比较项目。如下所示:(我使用伪代码来说明我的想法,代码可能有效,也可能不起作用)。基本上,我想知道我所拥有的物品是否在清单上。
main()
{
List<Node<T>> n = new List<Node<T>>()
bool found = false;
T v = new T();
foreach (Node<T> i in n)
{
if i.Content== v
{
found = true;
}
}
}我理解为了比较一个类的两个实例,我必须从IEquitable派生我的类,但是我想知道T是否属于我们一直在使用的预定义类,比如int、double、string .我不想重新定义这些类,但希望比较能够工作,并使用默认的比较器。如何编写上面的内容,以便c#接受它并抛出语法错误?
if i.Content== v
{
found = true;
}我试过了
if (T)i.Content == (T)v
{
...
}编译器似乎不喜欢它。实际上,我做了以下几件事:
Node<T> r = n.Where(x=> (T)x.Content==(T)v).FirstOrDefault()我得到的错误是:运算符==不能应用于'T‘和'T’类型的操作数,请通知。谢谢!
发布于 2016-12-02 16:24:05
可以将Node<T>声明更改为:
public class Node<T> where T : IEquatable<T>然后你就可以使用:
if (i.Content.Equals(v))
// ...发布于 2016-12-02 16:09:59
无法在泛型约束中指定运算符(如果您认为它是运算符,那么除了无参数的构造函数外)。
如果您需要某种方式的比较,则需要使用一种方法。要么使用Equals,要么添加一些接口(如IComparable<T> )作为一般约束。
https://stackoverflow.com/questions/40936418
复制相似问题