我很想说这个问题与我的一般架构有关,但无论哪种方式,它都可能比作为一个例子更容易展示。
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!
}
}
我希望我想要做的事情很容易看到,我应该做的事情更容易向我解释: - )。
答案 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