Интересно, нужно ли мне дважды определить коммутативный оператор (например, *
)!
public static MyClass operator *(int i, MyClass m)
{
return new MyClass(i * m.Value);
}
public static MyClass operator *(MyClass m, int i)
{
return new MyClass(m.Value * i);
}
Какова логика этого?
Дополнительные описания: Дорогой ответ @Marc об умножении Vector и Matrix был хорошим тогда и только тогда, когда мы предполагаем, что типы операндов разные! Очевидно, что мы можем определить оператор *
только один раз, чтобы выполнить умножение векторов или матриц. Поэтому я думаю, что это не ответ.
@Marc: порядок иногда важен для операторов.
Да, но это не эквивалентно порядку, иногда важно в операндах! Вышеприведенное предложение может быть использовано в случае использования оператора +
до (или после) *
оператора, что приведет к разным результатам. Например:
0 + 2 * 2 != 0 * 2 + 2
♦
Предположим, что мы определили оператор *
как:
public static MyClass operator *(MyClass m1, MyClass m2)
{
return new MyClass(m1.Value * m2.Value /* or some other kind of multiplication */);
}
Мы не можем определить его снова.
public static MyClass operator *(MyClass m2, MyClass m1) { ... }
Если это так, компилятор скажет нам, что тип MyClass
уже определяет член с именем op_Multiply с теми же параметрами.
Теперь мы можем использовать этот оператор двумя способами: m1 * m2
или m2 * m1
, и они могут иметь разные результаты, которые зависят от процедуры умножения.