class A<T1>
{
public virtual void Foo(T1 x) { }
class B<T2> : A<B<T2>>
{
class C : B<C>
{
public override void Foo(A<A<T1>.B<T2>>.B<A<T1>.B<T2>.C> x)
{
}
}
}
}
Здравствуйте, Хэлкар, Вы писали:
Х>Или я не понимаю конструкции class B<T> : A<B<T>>, дженерик параметр T перекрывает здесь одноименный дженерик параметр родительского класса.
Нет, ты все правильно сделал. Действительно, соль в том, что без переименования сигнатуру не вписать.
Здравствуйте, Aen Sidhe, Вы писали:
Х>> Х>>Кстати IntellySense студии не срабатывает на этом примере — он предлагает неработающий синтаксис Х>>
Х>>public override void Foo(A<B<T2>>.B<C> x)
Х>>
AS>Решарпер тоже. но если переименовать параметр в B<T>, то нормально вписывает.
Ну так ничего там сделать нельзя, как ни крути. Проблема-то в другом месте. Тут тоже нельзя сделать:
abstract class FooBase<T>
{
public abstract void Remove(int index);
public abstract void Remove(T item);
}
class FooInts : FooBase<int>
{
// тут уже ничего не сделать
}
N>Условие составлено с подвохом.
ааа, то есть если не оверрайдить метод, то все хорошо компилится, а что бы это сделать необходимо сперва переименовать типы?
Здравствуйте, Muxa, Вы писали:
M>ааа, то есть если не оверрайдить метод, то все хорошо компилится, а что бы это сделать необходимо сперва переименовать типы?
Точно. Потому что в правильной сигнатуре должны присутствовать упоминания двух разных типов-параметров с именем T от разных типов. Но в C# вутренний параметр всегда затеняет внешний, и не существует способа обратиться к ниму. Нельзя написать что-то вроде global::A<>::T.