Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 泛型与继承问题_C#_Design Patterns_Generics_Inheritance - Fatal编程技术网

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
如果不使用,则应将其删除,并且该示例中似乎不包含它。我们同意这一点。(我想说“是的”,但是愚蠢的角色限制…)