我想知道我是否必须*两次定义一个可交换运算符(如)!
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);
}
Run Code Online (Sandbox Code Playgroud)
这背后的逻辑是什么?
附加说明:亲爱的@Marc关于向量和矩阵乘法的答案是好的, 当且仅当我们假设操作数类型不同时!很明显,我们只能定义*一次运算符来执行向量或矩阵乘法.所以我认为这不是答案.
@Marc:订单在运营商中有时很重要.
是的,但这不等同于Order在操作数中有时很重要!如果在+操作员之前(或之后)使用操作*员将导致不同的结果,则可以使用上述句子.例如:
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 */);
}
Run Code Online (Sandbox Code Playgroud)
我们无法再定义它.
public static MyClass operator *(MyClass m2, MyClass m1) { ... }
Run Code Online (Sandbox Code Playgroud)
如果是这样,编译器会告诉我们该类型MyClass已经定义了一个名为'op_Multiply'的成员,它具有相同的参数类型.
现在,我们可以通过两种方式使用此运算符:m1 * m2或者m2 * m1它们可能具有不同的结果,这取决于乘法过程.
Mar*_*ell 33
顺序在运算符中有时很重要,经典的例子是subraction(-)和division(/).但是,它也适用于乘法:
例如,考虑它们是向量 - x是(2×1)向量,并且y是(1×2)向量.如果我们解释*为矩阵乘法,那么x * y是(2×2)向量,但是y * x(1×1)向量.
因此,C#编译器不假设二元运算符是可交换的,即使它们通常是(addition(+),multiplication(*)等).
Jon*_*eet 16
您不必这样做 - 如果您想要能够写,您只需要这样做:
MyClass x = ...;
MyClass y = x * 5;
MyClass z = 5 * x;
Run Code Online (Sandbox Code Playgroud)
如果你只想要一个底部两行中是有效的,你可以删除其他运算符重载.
基本上,C#语言并不假设即使在涉及的类型方面,乘法也是可交换的.