C# 泛型与继承问题
我很想说,这个问题与我的一般架构有关,但无论哪种方式,它都可能比描述更容易作为一个示例来展示C# 泛型与继承问题,c#,design-patterns,generics,inheritance,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&
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!
}
}
公共类AppUserBase
{
}
公共类AppUserAbc:AppUserBase
{
}
公共类ManagerBase,其中T:AppUserBase
{
受保护的AppUserCollection_users=新的AppUserCollection();
}
公共类ManagerAbc:ManagerBase
{
}
公共静态类程序
{
公共静态void Main()
{
ManagerAbc x=新的ManagerAbc();
DoSomething(x);//失败
}
公共静态void DoSomething(ManagerBase manager),其中M:ManagerBase,其中U:AppUserBase
{
//做点什么!
}
}
我希望我正在尝试做的事情很容易看到,我应该做的事情更容易向我解释:-)。这是因为您有两个类型参数,但只有一个在方法签名中,因此无法同时推断这两个参数。另一个是不需要的。将方法签名更改为:
public static void DoSomething<U>(ManagerBase<U> manager)
where U : AppUserBase
{
//do something!
}
publicstaticvoiddosomething(ManagerBase管理器)
其中U:AppUserBase
{
//做点什么!
}
这是因为您有两个类型参数,但在方法签名中只有一个,因此无法同时推断这两个参数。另一个是不需要的。将方法签名更改为:
public static void DoSomething<U>(ManagerBase<U> manager)
where U : AppUserBase
{
//do something!
}
publicstaticvoiddosomething(ManagerBase管理器)
其中U:AppUserBase
{
//做点什么!
}
你可能知道,他们想要工作。原因是ManagerAbc
不是ManagerBase
类型。通用零件属于同一类型也无济于事。您可以尝试更改为:
public static void DoSomething<M,U>(ManagerBase<U> manager) where M : Manager<U> where U : AppUserBase
publicstaticvoiddosomething(ManagerBase-manager)其中M:manager其中U:AppUserBase
你可能知道,他们想要工作。原因是ManagerAbc
不是ManagerBase
类型。通用零件属于同一类型也无济于事。您可以尝试更改为:
public static void DoSomething<M,U>(ManagerBase<U> manager) where M : Manager<U> where U : AppUserBase
publicstaticvoiddosomething(ManagerBase-manager)其中M:manager其中U:AppUserBase
这段代码甚至都不会编译。代码中没有Manager类。它给你的错误是什么?是编译时还是运行时?我们需要更多的信息,克里斯。还有,C#3.0还是4.0?4.0具有更好的协方差/反方差支持,这可能是这里的一个因素。抱歉,它是为了管理者而不是管理者。我已经修改了帖子。此外,C#4.0此代码甚至不可编译。代码中没有Manager类。它给你的错误是什么?是编译时还是运行时?我们需要更多的信息,克里斯。还有,C#3.0还是4.0?4.0具有更好的协方差/反方差支持,这可能是这里的一个因素。抱歉,它是为了管理者而不是管理者。我已经修改了帖子。此外,C#4.0这不会编译。M不在方法签名中,因此无法推断。@yoda:如果他像他那样调用它,它将不会编译,但他可以明确地告诉在进行调用时使用哪些类型。但是,M
如果不使用,则应将其删除,并且该示例中似乎不包含它。我们同意这一点。(我想说“是的”,但愚蠢的字符限制…)这无法编译。M不在方法签名中,因此无法推断。@yoda:如果他像他那样调用它,它将不会编译,但他可以明确地告诉在进行调用时使用哪些类型。但是,M
如果不使用,则应将其删除,并且该示例中似乎不包含它。我们同意这一点。(我想说“是的”,但是愚蠢的角色限制…)