Тип ограничения, позволяющий выполнять операции сложения/вычитания (+/-) в С#

Возможно ли это?

public interface Foo<TBar>
  where TBar : (can use the '+' and '-' operators)

Спасибо.

Ответы

Ответ 1

Вы можете создать тип Foo, который перегружает эти два оператора, а затем сдерживает ваш общий тип. Однако вы не можете ограничить свой общий параметр, чтобы потребовать, чтобы любой произвольный тип перегружал такие операторы на разовой основе.

Ответ 2

Да и Нет. Общий параметр может быть ограничен только

  • Внедрение inerface
  • Имейте доступный конструктор без параметров (new())
  • Введите определенный базовый тип
  • Быть структурой/классом

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

Однако это не работает в общем смысле. Независимо от того, какой базовый тип вы выберете, он не сможет работать с типами, которые наиболее часто используются с + и -. А именно int, double, string и т.д.... потому что они наследуют от ValueType, который не имеет этого ограничения

Ответ 3

Вы можете перегрузить операторы:

public static TBar operator +(TBar c1, TBar c2) 
{
   return ... // do the math
}

Ответ 4

Нет, это невозможно.

Можно теоретически ограничить TBar того типа, который реализует эти операторы, но операторы статичны, они не наследуются.

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

И нет, вы не можете ограничить свой общий параметр TBar "любым типом, который реализует эти операторы", он просто не доступен на языке.