Тип ограничения, позволяющий выполнять операции сложения/вычитания (+/-) в С#
Возможно ли это?
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 "любым типом, который реализует эти операторы", он просто не доступен на языке.