Как перегрузить оператор для класса с произвольным типом

214
26 мая 2018, 01:00

как я могу перегрузить оператор "+", чтобы можно было получить сумму двух узлов двоичного дерева поиска, учитывая то, что тип я у них сделал произвольным, но если будет тип Int у узлов, то тогда можно сложить, а если другой тип, то нельзя.

Вот код:

class Node<T>
{
    internal T value;
    public static Node<int> operator +(Node<int> A, Node<int> B)
    {
        return new Node<int>(A.value + B.value);
    }
    public int Balance
    {
        get
        {
            if (Left == null && Right == null)
                return 0;
            else if (Left == null && Right != null)
                return 0 - Right.Height;
            else if (Left != null && Right == null)
                return Left.Height;
            return (Left.Height - Right.Height);
        }
        private set { }
    }
    public int Height
    {
        get
        {
            if (Left == null && Right != null)
                return 1 + Right.Height;
            else if (Left != null && Right == null)
                return 1 + Left.Height;
            else if (Left != null && Right != null)
            {
                if (Left.Height >= Right.Height)
                    return Left.Height + 1;
                else
                    return Right.Height + 1;
            }
            else
                return 0;
        }
        private set
        {
        }
    }

Я хочу

  1. сделать так, чтобы эти оператором можно было воспользоваться только если тип значения узла Int
  2. не использовать для этого отдельный новый класс IntNode : Node<int> , а сделать это прямо в Node<T>

Мне выводит такую ошибку:

Тип одного из параметров бинарного оператора должен быть вмещающим.

Answer 1

сделать так, чтобы эти оператором можно было воспользоваться только если тип значения узла Int

Невозможно. Это невозможно даже в C++ с его текстовыми шаблонами формата "найти-заменить" (оператор будет доступен, но при компиляции вывалится 10КБ текста ошибок в потрохах инклюдов).

Если класс имеет разные члены в зависимости от параметров, то это не один класс. Вряд ли от этого принципа отступятся.

не использовать для этого отдельный новый класс IntNode : Node<int>, а сделать это прямо в Node<T>

Много вариантов:

  1. Построить Expression с оператором, скомпилировать.
  2. Сгенерировать IL в рантайме.
  3. Воспользоваться отражениями.
  4. Воспользоваться dynamic, который воспользуется отражениями.

Чистого варианта нет. Возможно, когда-нибудь будет, но я бы не сильно надеялся, что это случится скоро: у задачи Exploration: Shapes and Extensions нет ни статуса, ни майлстона (даже "X.0").

READ ALSO
Получить первый линк в блоке

Получить первый линк в блоке

Подскажите пожалуйста как брать текст только из первой пары <a></a>

196
Один экземпляр программы

Один экземпляр программы

Допустим, есть некоторая программа, которая что то делает с базойПользователи могут запускать ее на разных машинах

209
Как называется кнопка для работы с dataGridView

Как называется кнопка для работы с dataGridView

Как называется кнопка для работы с dataGridView те

169
Вместо нанесения урона сразу убивает

Вместо нанесения урона сразу убивает

у меня проблемка небольшая

191