【问题标题】:How can I create a generic type where T also can be int32,but not only a class如何创建一个泛型类型,其中 T 也可以是 int32,但不仅仅是一个类
【发布时间】:2013-06-13 22:28:17
【问题描述】:

我想创建一个通用堆栈

我有一个 Node 类

 public class GenericNode<T> where T : class
 {
    public T item;
    public GenericNode<T> next;

    public GenericNode()
    { 
    }
    public GenericNode(T item)
    {
        this.item = item;
    }
  }

并且可以像使用它一样

GenericNode<string> node = new GenericNode<string>("one")

但我不能用它

GenericNode<int> node = new GenericNode<int>(1)

因为 int 不是引用类型(不是类),我使用 where T: class 但 List 也不是引用类型。

如何解决我的问题?

【问题讨论】:

  • 第 4 行是一个无限循环。 ——编辑:没关系。语言错误>.>
  • @Magtheridon96 怎么样?我觉得很好。一个类引用另一个相同类型的实例是非常合适的。这是一个完全有效的链表实现。
  • @Servy 哦,天哪,我在使用 [c++] 标签搜索时检索到了这个问题 >.

标签: c# class generics reference int


【解决方案1】:

不要使用structclass 作为通用约束。然后你可以使用任何一个。

【讨论】:

  • 对不起,这是我的错误,深夜......你的回答没问题!
【解决方案2】:

使用struct 约束(或class,具体取决于您查看的问题的版本)意味着T 的类型不能为空,并且在您尝试使用&lt;string&gt; 时会引发异常。

删除它将允许您执行所需的步骤。

public class GenericNode<T> where T : IConvertible
{
 public T item;
 public GenericNode<T> next;

 public GenericNode()
 { 
 }
 public GenericNode(T item)
 {
    this.item = item;
 }
}

void Main()
{
 GenericNode<string> node = new GenericNode<string>("one");
 GenericNode<int> node2 = new GenericNode<int>(1);
}

【讨论】:

    【解决方案3】:

    删除class 约束:

    public class GenericNode<T> /* where T : class*/
    

    如果您放弃该约束,它将允许您的类使用任何类型,无论是值类型还是引用类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      相关资源
      最近更新 更多