首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >泛型类比较

泛型类比较
EN

Stack Overflow用户
提问于 2016-12-02 16:07:04
回答 2查看 58关注 0票数 1

我想创建一个泛型类节点如下:

代码语言:javascript
复制
public class Node<T>
{
  public Node<T> Next;
  public Node<T> Previous;
  T Content;

  public Node<T>()
  {
  }
}

在我的主要(或来自其他班级),我想比较项目。如下所示:(我使用伪代码来说明我的想法,代码可能有效,也可能不起作用)。基本上,我想知道我所拥有的物品是否在清单上。

代码语言:javascript
复制
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#接受它并抛出语法错误?

代码语言:javascript
复制
    if i.Content== v
    {
       found = true;
    }

我试过了

代码语言:javascript
复制
if (T)i.Content == (T)v 
{
  ...
}

编译器似乎不喜欢它。实际上,我做了以下几件事:

代码语言:javascript
复制
 Node<T> r = n.Where(x=> (T)x.Content==(T)v).FirstOrDefault()

我得到的错误是:运算符==不能应用于'T‘和'T’类型的操作数,请通知。谢谢!

EN

回答 2

Stack Overflow用户

发布于 2016-12-02 16:24:05

可以将Node<T>声明更改为:

代码语言:javascript
复制
public class Node<T> where T : IEquatable<T>

然后你就可以使用:

代码语言:javascript
复制
if (i.Content.Equals(v))
    // ...
票数 1
EN

Stack Overflow用户

发布于 2016-12-02 16:09:59

无法在泛型约束中指定运算符(如果您认为它是运算符,那么除了无参数的构造函数外)。

如果您需要某种方式的比较,则需要使用一种方法。要么使用Equals,要么添加一些接口(如IComparable<T> )作为一般约束。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40936418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档