返回T类型的泛型方法中两种T类型的C#不兼容

时间:2016-06-13 07:26:02

标签: c# generics generic-method

我试图通过使用以下方法返回T []数组的最大值。我不明白为什么编译器在这里抱怨T max = _genericList[0];抛出错误cannot implicitly convert ...\GenericList(9) to ...\GenericList(123)

为什么这两者有所不同?我想使用一些GenericList类的T []来插入它并找到最大值/最小值。怎么可能?

internal class GenericList<T>
{
    private T[] _genericList;
    private int _count;
    private int _listInnitialLength;

public GenericList(int listLength)
    {
        _genericList = new T[listLength];
        _count = 0;
        _listInnitialLength = listLength;
    }

    public T Max<T>() where T : IComparable
    {
        T max = _genericList[0];
        foreach (T item in _genericList)
        {
                if (Comparer<T>.Default.Compare(item, max) > 0)
                {
                    max = item;
                }
        }
        return max;
    }
}

3 个答案:

答案 0 :(得分:3)

你的问题在这里:

internal class GenericList<T>  where T : IComparable
{
    private T[] _genericList;
    private int _count;
    private int _listInnitialLength;

    public GenericList(int listLength)
    {
        _genericList = new T[listLength];
        _count = 0;
        _listInnitialLength = listLength;
    }

    public T Max()
    {
        T max = _genericList[0];
        foreach (T item in _genericList)
        {
            if (Comparer<T>.Default.Compare(item, max) > 0)
            {
                max = item;
            }
        }
        return max;
    }
}

你刚刚覆盖了类声明中定义的T.应该是:

{{1}}

答案 1 :(得分:2)

方法T中的Max<T>不是您班级GenericList<T>中定义的Max,即使它们具有相同的名称。我认为你应该将约束移到类中,并使internal class GenericList<T> where T : IComparable { //.... public T Max() { //.... } } 方法非泛型。

int main()
{
   switch(1,2)
   {
      case 1:printf("1");break;
      case 2:printf("2");break;
      default: printf("error");break;
   }
}

答案 2 :(得分:0)

其他答案可以解决您的问题,但为什么在T已实施IComparable时使用Comparer<T>.Default

if (item.CompareTo(max) > 0)
{
    max = item;
}