【问题标题】:Why Operator Methods Should Be Static In C#? [duplicate]为什么运算符方法在 C# 中应该是静态的? [复制]
【发布时间】:2019-08-13 20:36:31
【问题描述】:

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

我尝试在互联网上阅读不同的文章,但它们没有帮助我回答。

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

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

【问题讨论】:

    标签: c# static overloading operator-keyword


    【解决方案1】:

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

    以下规则适用于所有运算符声明:

    •操作符声明应包括 public 和 static 修饰符。

    •操作符的参数不能有修饰符。

    •操作符的签名(§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 关键字定义?以及为什么我必须重载 2 个不同版本的运算符函数来添加诸如 c+2 、 2+c 之类的东西?有什么方法可以让我摆脱争论顺序吗?
    猜你喜欢
    • 2015-10-15
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    • 2021-03-28
    • 2014-01-15
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多