【问题标题】:The type 'int' cannot be used as type parameter 'T' in the generic method. There is no boxing conversion from 'int'类型“int”不能用作泛型方法中的类型参数“T”。 'int' 没有拳击转换
【发布时间】:2021-04-27 20:41:39
【问题描述】:

我正在尝试实现分类垃圾容器。不幸的是,我在 C# 方面还没有那么丰富的经验,而且我显然没有得到处理泛型方法和相应接口的意义。以下是我的部分代码。

static void RandomNumbers()
{
    Random random = new Random((int)DateTime.Now.Ticks);
    SortedTrashContainer<int> trash = new SortedTrashContainer<int>(10);
    for (int i = 0; i < trash.Capacity; i++)
        trash.Add(random.Next(10));
    Console.WriteLine("== Random numbers ==");
    foreach (var item in trash)
        Console.Write(item + " ");
}
class SortedTrashContainer<T> where T : IContainer<T>, IComparable<T>
{
    private int size;
    private int pointer = 0;
    private T[] items;
    public int Capacity => size;
    public SortedTrashContainer(int capacity)
    {
        if (capacity >= 0)
        {
            size = capacity;
            items = new T[capacity];
        }
        else
            throw new ArgumentOutOfRangeException();
    }
    public void Add(T item)
    {
        if (pointer < size)
        {
            items[pointer++] = item;
            Sort(items);
        }
        else
            throw new InvalidOperationException();
    }
    private void Sort(T[] array)
    {
        int top = array.Length - 1;
        int indexOfLargest;
        do
        {
            indexOfLargest = 0;
            for (int i = 0; i <= top; i++)
            {
                if (array[indexOfLargest].CompareTo(array[i]) < 0)
                    indexOfLargest = i;
            }
            IComparable temp = (IComparable)array[top];
            array[top] = array[indexOfLargest];
            array[indexOfLargest] = (T)temp;
            top--;
        } while (top > 0);
    }
}

在我声明对象trash 并引用SortedTrashContainer 并将inttype 作为参数传递的行中,我收到编译错误“类型'int'不能用作类型泛型方法 SortedTrashContainer&lt;T&gt; 中的参数 T。从 intMyNameSpace.IContainer&lt;int&gt;" 没有装箱转换。不幸的是,我真的被困在这里。只是不明白这一点,什么可以解决这个问题。

【问题讨论】:

  • 你的 where 子句说 T 应该是 IContainer&lt;T&gt;,但 T 是 int
  • int 没有实现IContainer&lt;T&gt;,您已声明这两者都需要使用类型作为类型参数。因此错误。这是一个非常明显的错误。不清楚的是为什么你有这些限制,为什么你认为int 会满足第一个。
  • 我认为您的意思是说class SortedTrashContainer&lt;T&gt; : IContainer&lt;T&gt; where T : IComparable&lt;T&gt; 另外,您不需要将 T 转换为 Comparable 并返回到 T。

标签: c# collections boxing generic-method


【解决方案1】:

如果您不从 IContainer 实现您的类并将项目属性公开,您的代码将起作用。

【讨论】:

  • “使项目属性公开”与使这项工作有什么关系?您的答案目前包含许多正确的单词,但您的意思令人困惑。你能解释一下吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多