Интересно, должен ли я определить коммутативный оператор (например, *
) дважды!
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
, и они могут иметь разные результаты, которые зависят от процедуры умножения.
Я запустил сервер в режиме отсоединения (-d), как подключить его обратно, чтобы я мог убить сервер).