2016-05-17 34 views
0

下面的代碼提供了錯誤 「無法將類型‘的Calendar.MONTH’到‘System.Collections.Generic.List’」:不能在C#中調用重寫列表<T>。新增(...)

public class Month : List<Day>, INotifyPropertyChanged 
{ 
    public Month() { /* NOP */ } 

    public new void Add<Day>(Day pValue) 
    { 
    var list = (List<Day>)this; 

    list.Add(pValue); 
    } 
} 

我已經在這裏學習的建議: Why does calling a method in my derived class call the base class method?

這裏:

C# Call shadow method with generic cast

我想用一個Month.Add(...)方法重載List.Add(...)方法以將事件發送到目標XAML容器類,然後調用重寫的List.Add(...)方法。順便說一句,我使用的是VS2012,.NET 4.5,並且該應用程序是用於Win Phone 8(稍後的版本目前不是一個選項 - 對不起)。我提到這一點是因爲我從Win 8和Win 10之間的經驗知道很多。

+4

我確定您的意思是'base.Add(pValue);'而不是'list.Add(pValue);' –

+1

而不是使用繼承爲什麼不使用組合? – juharr

+1

爲什麼要繼承'List '而不是'Collection '? – Dennis

回答

2

這裏的問題是使用泛型類型參數和所有的轉換。既然你已經從通用的List<T>List<Day>派生你的類,那麼就不需要另外的類型參數。

鑄造在這裏並不是很有用。只需使用base.

public new void Add(Day pValue) 
{ 
    base.Add(pValue); 
} 

而不是使用的List<T>自定義實現,使用ObservableCollection<T>它已經這樣做都是爲了你。

如果您想保留您的列表,請自行實施IList<T>並使用備份列表存儲數據。在該類中,您可以完全控制添加,刪除等操作。

+0

感謝您的評論。我已經嘗試過你的建議,這裏是爲什麼我發現: 1.實施IList 我自己的作品。但這裏的目標是理解,所以我也.. – rfreytag

+0

_(以上評論是不完整的)_ 謝謝您的意見。我出於好奇嘗試了各種建議,發現: ** 1。**實現'IList '編譯和項目'添加(...)'。 ** 2。**使用'List '並使用'base.Add(...)'調用'像上面那樣工作 - 感謝我忘記了'base'。這是我需要的。 ** 3。''ObservableCollection '編譯,但我不熟悉它,所以有更多的掙扎比我喜歡複製一個簡單的行爲,如列表.Add(...)'。我認爲這並不像我使用'INotifyPropertyChanged'實現'Month'類那樣 - 對嗎? – rfreytag

+1

是的,應該做@rfreytag –