为什么C#中的运算符方法应该是静态的?

为什么C#中的运算符方法应该是静态的?,c#,static,overloading,operator-keyword,C#,Static,Overloading,Operator Keyword,为什么在C#中我们使用带运算符的静态方法 我试着在互联网上阅读不同的文章,但他们并没有帮助我回答这个问题 public static int operator+(int I, Complex C) { return C.x + I; } 另外,当我尝试执行c+2时,它可以正常工作,但当我执行2+c时,它会给我一个错误,因为我没有额外的重载函数来进行参数的调用匹配。有没有什么方法可以让我用一个重载运算符定义函数来运行c+2和2+c这两个语句?该规范对用户定义的运算符有以下说明(我的重

为什么在C#中我们使用带运算符的静态方法

我试着在互联网上阅读不同的文章,但他们并没有帮助我回答这个问题

public static int operator+(int I, Complex C) 
{ 
    return C.x + I;
}

另外,当我尝试执行c+2时,它可以正常工作,但当我执行2+c时,它会给我一个错误,因为我没有额外的重载函数来进行参数的调用匹配。有没有什么方法可以让我用一个重载运算符定义函数来运行c+2和2+c这两个语句?

该规范对用户定义的运算符有以下说明(我的重点)

以下规则适用于所有操作员声明:

操作员声明应包括公共和静态修饰符

•操作员的参数不得有修改器

•运营商的签名(§15.10.2、§15.10.3、§15.10.4)应不同于同一类别中声明的所有其他运营商的签名

•运营商声明中引用的所有类型应至少与运营商本身一样容易访问(§8.5.5)

•同一修改器在操作员声明中多次出现是错误的

“因为规范上这么说”可能不是最令人满意的答案,但这是我最好的答案。我猜虚拟调度对运营商来说没有多大意义

至于第二个问题,我的方法是实现一个执行操作的私有静态方法,然后让两个操作符实现指向它

大概是这样的:

public static int operator+(int i, Complex c) => AddInt(c, i); 

public static int operator+(Complex c, int i) => AddInt(c, i); 

private static int AddInt(Complex c, int i) => c.X + i;

我的问题是为什么操作符方法应该用static关键字定义?为什么我必须重载两个不同版本的操作符函数来添加像c+2,2+c这样的东西?有什么办法可以让我从争论中解脱出来吗?