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;
}
我正在尝试使用以下方法 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;
}