【问题标题】:Generics and Inheritance Problem泛型和继承问题
【发布时间】:2010-12-22 21:35:46
【问题描述】:

我很想说这个问题与我的一般架构有关,但无论哪种方式,作为示例显示可能比描述起来更容易。

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!
    }
}

我希望我正在尝试做的事情很容易看到,我应该做的事情更容易向我解释:-)。

【问题讨论】:

  • 这段代码甚至无法编译。您的代码中没有 Manager 类。它给你的错误是什么?它是编译时还是运行时?我们需要更多信息,克里斯。
  • 还有,C# 3.0 还是 4.0? 4.0 具有更好的协方​​差/逆变支持,这可能是这里的一个因素。
  • 对不起,它应该是 ManagerBase 而不是 Manager。我已经修改了帖子。另外,C# 4.0

标签: c# design-patterns generics inheritance


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您可能知道,这需要工作。原因是ManagerAbc 不是ManagerBase&lt;AppUserBase&gt; 类型。通用部分属于同一类型并没有帮助。您可以尝试更改为:

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

    【讨论】:

    • 这不会编译。 M 不在方法签名中,因此无法推断。
    • @yoda:如果他像他那样调用它,它不会编译,但他可以在调用时明确告诉使用哪些类型。不过M如果不用就应该去掉,好像例子里没有。
    • 我们同意。 (我想说“是的”,但愚蠢的字符限制......)
    猜你喜欢
    • 2011-08-20
    • 1970-01-01
    • 2013-06-26
    • 2011-08-01
    • 2011-06-14
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    相关资源
    最近更新 更多