2016-05-17 9 views
0

Следующий код выдает ошибку "Невозможно преобразовать тип 'Calendar.Month' до '' System.Collections.Generic.List":не может вызвать ПЕРЕОПРЕДЕЛЕНЫ Список <T> .Add (...) в C#

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

Я хочу переопределить метод List.Add (...) методом Month.Add (...) для отправки события в целевые классы контейнеров XAML, а затем вызвать переопределенный метод List.Add (...) ,

Кстати, я использую VS2012, .NET 4.5, а приложение для Win Phone 8 (более поздние версии в настоящее время не являются опцией - извините). Я упоминаю об этом, потому что я знаю по опыту многое изменилось между Win Phone 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 ' компиляции и элементы 'Add (...)'. ** 2. ** используя 'List ' и вызов с использованием 'base.Add (...)' работает как выше - спасибо, я просто забыл о «базе». Это то, что мне нужно. ** 3.** 'ObservableCollection ' компилируется, но я не знаком с ним, поэтому имею больше борьбы, чем мне нравится реплицировать простое поведение, например 'List .Add (...)'. Я не думаю, что мне это очень понравилось, когда я реализовал класс «Month», используя 'INotifyPropertyChanged' - правильно? – rfreytag

+1

Да, это должно быть @rfreytag –