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

C# incompatibility in two T types in generic method which return T type

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

为什么这两个不同?我想使用一些 GenericList class 实例的 T[] 对其进行插值并找到 maximum/minimum。这怎么可能?

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;
    }
}

你在方法Max<T>中的T不是你classGenericList<T>中定义的那个,即使它们有相同的名字。我认为您应该将约束移至 class 并使 Max 方法成为非通用方法。

internal class GenericList<T> where T : IComparable
{
    //....
    public T Max()
    {
        //....
    }
}

您的问题在这里:

public T Max<T>() where T : IComparable

您刚刚覆盖了 class 声明中定义的 T。应该是:

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 已经实现 IComparable 时使用 Comparer<T>.Default

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