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.

→ Ссылка