Подтвердить что ты не робот

Есть ли общее ограничение, которое я мог бы использовать для оператора +?

есть ли какие-либо типы 'where', которые могут быть добавлены, чтобы скомпилировать следующий код?

public class Plus<T> : BinaryOperator<T> where T : ...
{
    public override T Evaluate(IContext<T> context)
    {
        return left.Evaluate(context) + right.Evaluate(context);
    }
}

Спасибо:)

4b9b3361

Ответ 1

В С# таких устройств нет. Однако есть несколько вариантов:

  • в С# 4.0 и .NET 4.0 (или выше) используйте dynamic, который поддерживает +, но не предлагает проверку времени компиляции
  • в .NET 3.5 (или выше), MiscUtil предлагает Operator класс что делает операторы доступными как методы - снова, без какой-либо проверки времени компиляции

Итак, либо:

return (dynamic)left.Evaluate(context) + (dynamic)right.Evaluate(context);

или

return Operator.Add(left.Evaluate(context), right.Evaluate(context));

Ответ 2

Ограничения параметра Type в С# очень ограничены и перечислены здесь. Таким образом, ответ не доходит до того, как выполняется проверка времени компиляции. Если T - тип, который вы создаете и управляете, один из способов сделать это -

interface IAddable 
{
   IAddable Add(IAddable foo);
}

и реализовать IFoo для всех ваших типов и использовать where T: IAddable как ограничение и использовать Add() вместо +

Ответ 3

Используя общие ограничения, вы можете заставить T

  • для ссылочного типа или типа значения
  • для наследования определенного класса
  • для реализации определенного интерфейса
  • иметь конструктор без параметров

Но это все. Вы не можете заставить существование статического operator+ на нем.