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

C# 无法将泛型类型强制转换为接口

C# 无法将泛型类型强制转换为接口,c#,.net,generics,inheritance,casting,C#,.net,Generics,Inheritance,Casting,我有这些类型: public interface ICommand {} public class RemoveCommand<T>: ICommand { public int Id {get; set;} } public interface ICommandHandler<TCommand> where TCommand: ICommand { void HandleCommand(TCommand command); } public cla

我有这些类型:

public interface ICommand {}

public class RemoveCommand<T>: ICommand
{
    public int Id {get; set;}
}

public interface ICommandHandler<TCommand> where TCommand: ICommand
{
    void HandleCommand(TCommand command);
}

public class RemoveCommandHandler<T> : ICommandHandler<RemoveCommand<T>>
{
   public void HandleCommand(SoftRemoveCommand<T> command)
   {
       ...
   }
}
公共接口ICommand{}
公共类RemoveCommand:ICommand
{
公共int Id{get;set;}
}
公共接口ICommandHandler,其中TCommand:ICommand
{
无效HandleCommand(TCommand命令);
}
公共类RemoveCommandHandler:ICommandHandler
{
公共无效HandleCommand(SoftRemoveCommand命令)
{
...
}
}
当我试图使用Castle Windsor解析我的ICommandHandler时,我收到了一个强制转换异常。所以我写了这个:

var obj = new RemoveCommandHandler<RemoveCommand<MyClass>>();
bool t1 = obj is ICommandHandler<RemoveCommand<MyClass>>; //return false!
bool t2 = obj.GetType().IsAssignableFrom(ICommandHandler<RemoveCommand<MyClass>>); //also false!
var obj=new RemoveCommandHandler();
bool t1=obj是ICommandHandler//返回错误!
bool t2=obj.GetType().IsAssignableFrom(ICommandHandler)//也是假的!
所以我的问题是:
为什么我的RemoveCommandHandler不能从ICommandHandler分配?

您的泛型类声明是
RemoveCommandHandler
。因此,如果您有类
RemoveCommandHandler
,这意味着您的
T
RemoveCommand

因此,您应该将
RemoveCommandHandler
更改为
RemoveCommandHandler
,代码应该可以工作:

var obj = new RemoveCommandHandler<MyClass>();
bool t1 = obj is ICommandHandler<RemoveCommand<MyClass>>;  // returns true
var obj=new RemoveCommandHandler();
bool t1=obj是ICommandHandler;//返回true
尽管对于第二次检查,您需要切换侧面:

bool t2 = typeof(ICommandHandler<RemoveCommand<MyClass>>).IsAssignableFrom(obj.GetType());  // returns true
boolt2=typeof(ICommandHandler).IsAssignableFrom(obj.GetType());//返回true

谢谢你!我应该自己提的。