Перегрузка арифметического оператора для универсального класса в C # - PullRequest
30 голосов
/ 16 апреля 2009

Учитывая общее определение класса, например

public class ConstrainedNumber<T> :
    IEquatable<ConstrainedNumber<T>>,
    IEquatable<T>,
    IComparable<ConstrainedNumber<T>>,
    IComparable<T>,
    IComparable where T:struct, IComparable, IComparable<T>, IEquatable<T>

Как я могу определить для него арифметические операторы?

Следующее не компилируется, потому что оператор «+» нельзя применить к типам «T» и «T»:

public static T operator +( ConstrainedNumber<T> x, ConstrainedNumber<T> y)
{
    return x._value + y._value;
}

Общий тип 'T' ограничен ключевым словом 'where', как вы можете видеть, но мне нужно ограничение для числовых типов, которые имеют арифметические операторы (IArithmetic?).

'T' будет примитивным типом чисел, таким как int, float и т. Д. Есть ли ограничение «где» для таких типов?

Ответы [ 12 ]

0 голосов
/ 16 апреля 2009

Я видел некоторые потенциальные решения, включающие деревья выражений, где выражение оператора создается вручную.

Это не идеально, потому что вы теряете проверку во время компиляции, но это может помочь вам.

вот статья об этом.

0 голосов
/ 16 апреля 2009

К сожалению, это невозможно, поскольку для целых чисел не определен интерфейс IArithmetic (как вы сказали). Вы можете обернуть эти примитивные типы в классы, которые реализуют такой интерфейс.

...