Генерика и проблема наследования - PullRequest
0 голосов
/ 23 декабря 2010

Я испытываю желание сказать, что эта проблема связана с моей общей архитектурой, но в любом случае это, вероятно, проще показать в качестве примера, чем было бы описать.

public class AppUserBase
{
}

public class AppUserAbc : AppUserBase
{
}

public class ManagerBase<T> where T : AppUserBase
{
    protected AppUserCollection<T> _users = new AppUserCollection<T>();
}

public class ManagerAbc : ManagerBase<AppUserAbc>
{

}

public static class Program
{
    public static void Main()
    {
        ManagerAbc x = new ManagerAbc();
        DoSomething(x); //fails
    }

    public static void DoSomething<M,U>(ManagerBase<AppUserBase> manager) where M : ManagerBase<U> where U : AppUserBase
    {
        //do something!
    }
}

Я надеюсь, что то, что я пытаюсь сделать, легко увидеть, а то, что я должен делать, мне еще легче объяснить: -).

Ответы [ 2 ]

3 голосов
/ 23 декабря 2010

Это потому, что у вас есть два параметра типа, но в сигнатуре метода есть только один, поэтому он не может вывести оба. Другой не нужен. Измените подпись вашего метода на:

public static void DoSomething<U>(ManagerBase<U> manager)
    where U : AppUserBase
{
    //do something!
}
0 голосов
/ 23 декабря 2010

Это хотят работать, как вы, наверное, знаете.Причина в том, что ManagerAbc не относится к типу ManagerBase<AppUserBase>.Это не помогает, что общая часть того же типа.Вы можете попробовать изменить на:

public static void DoSomething<M,U>(ManagerBase<U> manager) where M : Manager<U> where U : AppUserBase
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...