[Этюд] Исправьте сигнатуру у override
От: nikov США http://www.linkedin.com/in/nikov
Дата: 20.06.08 07:09
Оценка:
class A<T> 
{
    public virtual void Foo(T x){}

    class B<T> : A<B<T>>
    {
        class C : B<C>
        {
            public override void Foo(B<T> x) // Исправьте сигнатуру
            {
            }
        }
    }
}
Re: [Этюд] Исправьте сигнатуру у override
От: Хэлкар  
Дата: 20.06.08 07:17
Оценка: 11 (1)
???
    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)
                {
                }
            }
        }
    }
Re[2]: [Этюд] Исправьте сигнатуру у override
От: Хэлкар  
Дата: 20.06.08 07:19
Оценка:
Или я не понимаю конструкции class B<T> : A<B<T>>, дженерик параметр T перекрывает здесь одноименный дженерик параметр родительского класса.
Re[3]: [Этюд] Исправьте сигнатуру у override
От: nikov США http://www.linkedin.com/in/nikov
Дата: 20.06.08 07:22
Оценка:
Здравствуйте, Хэлкар, Вы писали:

Х>Или я не понимаю конструкции class B<T> : A<B<T>>, дженерик параметр T перекрывает здесь одноименный дженерик параметр родительского класса.


Нет, ты все правильно сделал. Действительно, соль в том, что без переименования сигнатуру не вписать.
Re[4]: [Этюд] Исправьте сигнатуру у override
От: Хэлкар  
Дата: 20.06.08 07:29
Оценка:

Кстати IntellySense студии не срабатывает на этом примере — он предлагает неработающий синтаксис
public override void Foo(A<B<T2>>.B<C> x)
Re[5]: [Этюд] Исправьте сигнатуру у override
От: Aen Sidhe Россия Просто блог
Дата: 20.06.08 08:19
Оценка:
Здравствуйте, Хэлкар, Вы писали:

Х>

Х>Кстати IntellySense студии не срабатывает на этом примере — он предлагает неработающий синтаксис
Х>
Х>public override void Foo(A<B<T2>>.B<C> x)
Х>


Решарпер тоже. но если переименовать параметр в B<T>, то нормально вписывает.
С уважением, Анатолий Попов.
ICQ: 995-908
Re[6]: [Этюд] Исправьте сигнатуру у override
От: Хэлкар  
Дата: 20.06.08 08:21
Оценка:
AS>Решарпер тоже. но если переименовать параметр в B<T>, то нормально вписывает.

Студия не разбирается и после переименования.
Re: [Этюд] Исправьте сигнатуру у override
От: Muxa  
Дата: 20.06.08 11:54
Оценка:
помогите написать override для Foo в классе B
Re[2]: [Этюд] Исправьте сигнатуру у override
От: Хэлкар  
Дата: 20.06.08 11:57
Оценка:
Здравствуйте, Muxa, Вы писали:

M>помогите написать override для Foo в классе B



            public override void Foo(A<T1>.B<T2> x)
            {
                
            }
Re[3]: [Этюд] Исправьте сигнатуру у override
От: Muxa  
Дата: 20.06.08 12:13
Оценка:
откуда Т1 и Т2?
я с Т пробовал то же самое — студия ошибку выдавала.

или условие некорректно составлено?
Re[4]: [Этюд] Исправьте сигнатуру у override
От: nikov США http://www.linkedin.com/in/nikov
Дата: 20.06.08 12:26
Оценка:
Здравствуйте, Muxa, Вы писали:

M>или условие некорректно составлено?


Условие составлено с подвохом.
Re[6]: [Этюд] Исправьте сигнатуру у override
От: orangy Россия
Дата: 20.06.08 13:16
Оценка:
Здравствуйте, 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>
{
 // тут уже ничего не сделать
}
... << RSDN@Home 1.2.0 alpha rev. 655>>
"Develop with pleasure!"
Re[5]: [Этюд] Исправьте сигнатуру у override
От: Muxa  
Дата: 20.06.08 14:31
Оценка:
N>Условие составлено с подвохом.
ааа, то есть если не оверрайдить метод, то все хорошо компилится, а что бы это сделать необходимо сперва переименовать типы?
Re[6]: [Этюд] Исправьте сигнатуру у override
От: nikov США http://www.linkedin.com/in/nikov
Дата: 20.06.08 14:35
Оценка:
Здравствуйте, Muxa, Вы писали:

M>ааа, то есть если не оверрайдить метод, то все хорошо компилится, а что бы это сделать необходимо сперва переименовать типы?


Точно. Потому что в правильной сигнатуре должны присутствовать упоминания двух разных типов-параметров с именем T от разных типов. Но в C# вутренний параметр всегда затеняет внешний, и не существует способа обратиться к ниму. Нельзя написать что-то вроде global::A<>::T.
Re[7]: [Этюд] Исправьте сигнатуру у override
От: Muxa  
Дата: 20.06.08 14:43
Оценка:
N>Точно.
вот теперь Решарпер справился
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.