Есть ли общее ограничение, которое я мог бы использовать для оператора +?
есть ли какие-либо типы 'where', которые могут быть добавлены, чтобы скомпилировать следующий код?
public class Plus<T> : BinaryOperator<T> where T : ...
{
public override T Evaluate(IContext<T> context)
{
return left.Evaluate(context) + right.Evaluate(context);
}
}
Спасибо:)
Ответы
Ответ 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+
на нем.
Ответ 4
Вы имеете в виду общее ограничение?
http://msdn.microsoft.com/en-us/library/d5x73970.aspx