Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.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#_Generics_Inheritance_Dynamic Binding - Fatal编程技术网

C# 当基类也具有泛型时,是否可以继承具有泛型的类?

C# 当基类也具有泛型时,是否可以继承具有泛型的类?,c#,generics,inheritance,dynamic-binding,C#,Generics,Inheritance,Dynamic Binding,我为标题的混乱道歉,我不太确定如何简明扼要地表达我的问题。 在这里,我有一个不编译的类结构 class MyEvent { } class EventA : MyEvent { } class EventB : MyEvent { } class MyEventHandler<T> where T : MyEvent { } class EventAHandler : MyEventHandler<EventA> { } class EventBHand

我为标题的混乱道歉,我不太确定如何简明扼要地表达我的问题。 在这里,我有一个不编译的类结构

class MyEvent
{ }

class EventA : MyEvent
{ }

class EventB : MyEvent
{ }

class MyEventHandler<T>
    where T : MyEvent
{ }

class EventAHandler : MyEventHandler<EventA>
{ }

class EventBHandler : MyEventHandler<EventB>
{ }

/*** Tests ***/

abstract class MyEventHandlerTesterBaseClass<SomeEventHandler>
    where SomeEventHandler : MyEventHandler<MyEvent>
{
    // Plan to set up handler for the concrete test classes below.
    protected SomeEventHandler handler;  
}

class EventAHandlerTests : MyEventHandlerTesterBaseClass<EventAHandler>
{ }

class EventBHandlerTests : MyEventHandlerTesterBaseClass<EventBHandler>
{ }
对于
EventBHandlerTests
也是如此

我的理解是,
EventAHandler
应该可以转换为
MyEventHandler
,因为
EventAHandler
继承了
MyEventHandler
,因此
EventA
应该动态绑定到
MyEvent


我做错什么了吗?或者这是不可能的?

问题是T类型的泛型类不能强制转换为U:T类型的另一个泛型类

例如:

class Foo{}
类栏:Foo{}
无效测试()
{
列表栏;
List foos=bar;//不起作用!!!
}
在您的情况下,
MyEventHandler-baseclass
期望泛型类型为
MyEventHandler
,但
EventAHandler
的类型为
MyEventHandler
,因此不起作用。这可以通过使用以下两种泛型来避免:

抽象类MyEventHandlerTesterBaseClass
唐德勒在哪里:我的唐德勒
其中TEvent:MyEvent

这是否回答了您的问题?
The type 'EventAHandler' must be convertible to 'MyEventHandler<MyEvent>' in order to use it as parameter 'SomeEventHandler' in the generic class 'MyEventHandlerTesterBaseClass<SomeEventHandler>'