C#修饰符覆盖对此项无效

时间:2012-07-29 05:31:41

标签: c#

所以编译器不允许我超载我班级的==和!=运算符。这是班级的样子:

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);
    }
}

编译器一直告诉我“修饰符'覆盖'对这个项目无效。起初我以为我可能没有将基本方法声明为虚拟,但是我的类没有派生出来。任何想法发生了什么?< / p>

3 个答案:

答案 0 :(得分: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方法也是一种好习惯。

答案 1 :(得分:1)

您正在从Object类派生您的类,该类没有==或!=运算符。所以你不能覆盖那些操作符。

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

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

答案 2 :(得分:0)

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

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

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

这样的东西时
xxx == yyy

它使用重载决策来找出要使用的==。这类似于

Meth(xxx, yyy)

编译器会考虑Meth(Object, Object)Meth(String, String)Meth(Item, Item)之类的重载,并找出哪些(如果有的话)最适合xxx的编译时类型和yyy

当然,这只是一种无意义,但有助于记住在更改static运算符时包含override而非==的原因。