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

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

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

Спасибо :))

Ответы [ 4 ]

20 голосов
/ 14 мая 2011

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

Так что либо:

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

или

return Operator.Add(left.Evaluate(context), right.Evaluate(context));
4 голосов
/ 14 мая 2011

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

interface IAddable 
{
   IAddable Add(IAddable foo);
}

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

1 голос
/ 14 мая 2011

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

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

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

0 голосов
/ 13 мая 2011

Вы имеете в виду родовое ограничение?

http://msdn.microsoft.com/en-us/library/d5x73970.aspx

...