Обобщения дилемма

Рейтинг: 0Ответов: 1Опубликовано: 22.01.2015

С методом разобрался, но почему теперь здесь не создает новый объект? Уж простите меня за непонимание.

using System;
interface IA<T>
{
    void Z(T t);
}
class a<T> where T : IA<T>
{
}
class b<T> : IA<T>
{
    public void Z(T t)
    {
        Console.WriteLine(t.GetType().Name);
    }
}
class c
{
    static void Main()
    {
        a<b<int>> A = new a<b<int>>();
    }
}

Почему же он не хочет создавать объект, что ему теперь здесь не так?

Ответы

▲ 1Принят

Вот эта строчка

class a<T> where T : IA<T>

накладывает на генерик-параметр ограничение - подставляемый класс T должен реализовать интерфейс IA<T>

Т.е. если вы подставляете туда класс SomeClass, то SomeClass должен быть объявлен как

class SomeClass : IA<SomeClass> { ...

Класс b<int> такому ограничению явно не соответствует - он реализует IA<int>, а не IA<b<int>>.

То, что метки (генерик-параметры) в классах называются одинаково - ничего не значит. T в контексте класса a<T> - это совсем не то же самое, что T в контексте класса b<T>.

в рамках закрытия старых неотвеченных вопросов