2012-07-29 30 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