泛型与继承问题

时间:2010-12-22 21:35:46

标签: c# design-patterns generics inheritance

我很想说这个问题与我的一般架构有关,但无论哪种方式,它都可能比作为一个例子更容易展示。

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 个答案:

答案 0 :(得分:3)

这是因为你有两个类型参数,但只有一个在方法签名中,所以它不能推断两者。另一个是不需要的。将您的方法签名更改为:

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

答案 1 :(得分:0)

你可能知道那就想要工作。原因是ManagerAbc不属于ManagerBase<AppUserBase>类型。通用部件属于同一类型并没有帮助。您可以尝试更改为:

public static void DoSomething<M,U>(ManagerBase<U> manager) where M : Manager<U> where U : AppUserBase