所以编译器不允许我超载我班级的==和!=运算符。这是班级的样子:
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>
答案 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
而非==
的原因。