Почему я должен определять коммутативный оператор дважды?

Интересно, должен ли я определить коммутативный оператор (например, * ) дважды!

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 ответ о векторном и матричном умножении был хорошим тогда и только тогда, когда мы предполагаем, что типы операндов различны!!! Очевидно, что оператор * можно определить только один раз для выполнения умножения вектора или матрицы. Поэтому я думаю, что это не ответ.

@ Марк: Порядок иногда важен для операторов.

Да, но это не эквивалентно Порядок иногда важен в операндах! Вышеупомянутое предложение может использоваться в случае использования оператора + до (или после) * оператора, который приведет к различным результатам. Например,

0 + 2 * 2! = 0 * 2 + 2

Assume, что мы определили оператор * как

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 , и они могут иметь разные результаты, которые зависят от процедуры умножения.

-121--1097752- Как подключиться обратно к серверу WEBrick Я запустил сервер в режиме отсоединения (-d), как подключиться обратно к нему, чтобы убить сервер).

Я запустил сервер в режиме отсоединения (-d), как подключить его обратно, чтобы я мог убить сервер).

6
задан Jason 12 September 2011 в 09:56
поделиться