1

所以编译器不允许我重载我类的 == 和 != 运算符。下面是这个类的样子:

public class Item
{
    public string _name;
    public double _weight;
    public decimal _wholesalePrice;
    public int _quantity;

    public Item(string name, double weight, decimal wholesalePrice, int quantity)
    {
        _name = name;
        _weight = weight;
        _wholesalePrice = wholesalePrice;
        _quantity = quantity;
    }

    public static override bool operator ==(Item left, Item right)
    {
        if (left._name == right._name)
        {
            return true;
        }
        return false;
    }

    public static override bool operator !=(Item left,Item right)
    {
        return !(left == right);
    }
}

编译器一直告诉我“修饰符 'override' 对此项目无效。起初我以为我可能没有将基方法声明为虚拟,但我的类没有派生。任何想法发生了什么?

4

3 回答 3

2

除非您从父类派生该类,否则您不能声明覆盖。您也不能在静态方法上声明覆盖。您是否尝试过一起删除覆盖?这似乎对我有用......

public class Item
{
    public string _name;
    public double _weight;
    public decimal _wholesalePrice;
    public int _quantity;

    public Item(string name, double weight, decimal wholesalePrice, int quantity)
    {
        _name = name;
        _weight = weight;
        _wholesalePrice = wholesalePrice;
        _quantity = quantity;
    }

    public static bool operator ==(Item left, Item right)
    {
        if (left._name == right._name)
        {
            return true;
        }
        return false;
    }

    public static bool operator !=(Item left, Item right)
    {
        return !(left == right);
    }
}

附带说明一下,如果您重写 == 和 != 运算符,那么重写 GetHashCode 和 Equals 方法也是一种好习惯。

于 2012-07-29T05:34:34.740 回答
1

您正在从没有 == 或 != 运算符的类 Object 派生您的类。因此,您不能覆盖这些运算符。

此外,您不能覆盖静态运算符或方法,只能覆盖实例方法。

最后,请注意覆盖和重载是两个非常不同的东西。重载是您有多个具有相同名称但签名不同的方法定义(例如,不同的参数)。

于 2012-07-29T05:41:55.317 回答
0

简短的回答是语法public static bool operator ==(Item left, Item right)没有override关键字。

这称为运算符重载,而不是覆盖。

您可能会将其==视为一种采用两个参数的静态方法(在虚构的“全局”类中)。当编译器看到类似

xxx == yyy

它使用重载决议来找出==使用哪个。这类似于

Meth(xxx, yyy)

编译器在哪里考虑重载,如Meth(Object, Object), Meth(String, String)Meth(Item, Item)并找出其中哪些(如果有)最适合xxxand的编译时类型yyy

当然,这只是一种无稽之谈,但有助于记住为什么要包含static而不是override在更改==运算符时包含。

于 2012-07-29T06:09:30.297 回答