Operator '<' cannot be applied to operands of type 'T' and 'T'
Ошибка возникает при сравнение значений в бинарном поиске
Функция где возникает ошибка
private int _search(T value, LinkedList<T> current)
{
int home = 0;
int end = current.Count;
while(home <= end)
{
LinkedList<T> linkedGuess = current;
int mid = (home + end) / 2;
for(int i = 0; i < mid; i++)
{
linkedGuess = current._next;
}
T guess = linkedGuess._value;
if(Equals(guess, value))
{
return mid;
}
else if(guess < value)// Место ошибки
{
home += 1;
}
else if(guess > value)//Место ошибки
{
end -= 1;
}
}
return -1;
}
Весь класс
namespace Linear_Linked_List
{
public class LinkedList<T>
{
private T _value;
private LinkedList<T> _next;
public int Count {get; private set;} = 0;
public LinkedList(T value, LinkedList<T> next)
{
_value = value;
_next = next;
}
private int _search<Type>(T value, LinkedList<T> current)
{
int home = 0;
int end = current.Count;
while(home <= end)
{
LinkedList<T> linkedGuess = current;
int mid = (home + end) / 2;
for(int i = 0; i < mid; i++)
{
linkedGuess = current._next;
}
T guess = linkedGuess._value;
if(Equals(guess, value))
{
return mid;
}
else if(guess < value)
{
home += 1;
}
else if(guess > value)
{
end -= 1;
}
}
return -1;
}
public int Search(T value)
{
return _search<T>(value, this);
}
public bool Add(T value)
{
LinkedList<T> current = this;
if(current._next == null)
{
current._next = new LinkedList<T>(value, null);
Count++;
return true;
}
else
{
while(current._next != null)
{
current = current._next;
}
current._next = new LinkedList<T>(value, null);
Count++;
return true;
}
}
public bool Remove(T value)
{
return false;
}
}
}
Ответы (2 шт):
Автор решения: lwich
→ Ссылка
Ошибка возникает, потому что T - это любой тип, но не каждый тип поддерживает операторы сравнения. Используйте ограничение IComparable и метод CompareTo вместо оператора сравнения.
Автор решения: PashaPash
→ Ссылка
В дополнение к соседнему ответу:
В .NET 6 появился интерфейс INumber<T>, который позволяет привести ваш код в рабочее состояние добавлением ограничения на тип:
public class LinkedList<T> where T: INumber<T>
Фича в превью, так что придется установить последний .NET SDK и включить фичу в csproj файле:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<EnablePreviewFeatures>true</EnablePreviewFeatures>
<LangVersion>preview</LangVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="System.Runtime.Experimental" Version="6.0.0-preview.7.21377.19" />
</ItemGroup>
</Project>
В текущей релизной версии .NET - придется добавлять ограничение where T: IComparable и сравнивать вызовами CompareTo.