为什么C#要求操作符重载必须是静态方法而不是成员函数(像C++那样)?(更具体地说:这个决定的设计动机是什么?)
这个问题已经被Eric Lippert在一篇详细的博客文章中回答过,但该文章现已被删除。这里是存档版本。
关于值类型和实例操作符还有另一个更微妙的点。静态操作符使得这种代码成为可能:
class Blah {
int m_iVal;
public static Blah operator+ (Blah l, int intVal)
{
if(l == null)
l = new Blah();
l.m_iVal += intVal;
return l;
}
}
//main
Blah b = null;
b = b + 5;
因此,即使引用为空,您仍然可以调用运算符。这在实例运算符的情况下不适用。
请看此文章。
原因有几个,主要的似乎是为了保持运算符对称性(使二元操作的左操作数不会受到特殊处理,因为它负责分派操作)。