Правильный код:
class ListDemo<T>:List<T>
{
public new void Add(T value)
{
base.Add(value);
}
}
Вам не нужен параметр типа как в объявлении класса, так и в методе. Это объявление класса, которое в данном случае является общим; поэтому, когда вы пытаетесь объявить метод Add как принимающий параметр общего типа с именем T, компилятор пожалуется, что вы пытаетесь иметь 2 параметра типа с одинаковым именем.
Редактировать : Исправлен пример кода. Поскольку Add не является виртуальным, его нельзя переопределить с помощью ключевого слова override (поэтому исходный пример фактически не будет компилироваться). Вы все еще можете объявить это, используя new, но это может привести к другому значению вашего метода Add. Я бы настоятельно рекомендовал просто внедрить IList , как это предлагается в комментариях.