2012-07-29 28 views
1

因此,编译器不会允许我重载我的类的==和!=运算符。这里是一流的样子: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); 
    } 
} 

编译器不断告诉我“的修改‘覆盖’是无效的这个项目起初我还以为我可能没有声明的基础方法,虚拟的,但我类并没有的。任何想法是怎么回事?

回答

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方法也是一种很好的做法。

+0

幸运的是,我覆盖了下面的这些方法:)我只是没有包含它们。无论如何,等于什么?我什么时候会用这个来代替==运算符? – Nick 2012-07-29 15:15:58

+0

==运算符通常比较对象引用,而不是对象内的值。 Equals方法比==运算符更频繁地用于比较对象的值。大多数.NET类(Dictionary等)都使用Equals方法来比较对象,所以如果你只是重载==操作符,这些类将不会像预期的那样工作。 – 2012-07-29 17:58:11

1

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

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

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

0

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

这称为运营商重载,而不是重写。

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

xxx == yyy 

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

Meth(xxx, yyy) 

编译器在哪里认为像Meth(Object, Object)Meth(String, String)Meth(Item, Item)超载并找出哪些人(如果有的话)最适合的编译时类型的xxxyyy

这当然只是一种手语,但是当您更改==操作符时,有助于记住为什么包含static而不是override

+0

我认为它是不可能重写静态方法? – Nick 2012-07-29 15:14:14

+0

@ user1556487这是正确的。一个“正常”的静态方法(操作符重载预留)不能是虚拟的,并且不能被覆盖。它们仍然是继承的,但是说'BaseClass.MyStaticMethod()'总是等同于'DerivedClass.MyStaticMethod()'(除非'DerivedClass'引入了一个具有相同名称的隐藏'BassClass'方法的新方法,但是与重写无关)。 – 2012-07-29 16:58:19