2016-02-15 23 views
1

我公司已拥有这样的铸造实现该接口与泛型类型

public interface IBaseService<TBaseUser> where TBaseUser : BaseUser 
{ 
    // snip 
} 

public class User : BaseUser 
{ 
    // snip 
} 

public class SomeService : IBaseService<User> 
{ 

} 

各种应用的代码共享库利用这个共享代码。我正在尝试编写一个基础控制器,它的ctor中有一个IBaseService<BaseUser>

public class BaseController : Controller 
{ 
    public BaseController(IBaseService<BaseUser> service) 
    { 
    } 
} 

在库级代码工作正是我所期待,但是当我尝试从一个消费应用程序中使用,并通过在派生型,即Service类型,它失败了无效的转换。

public class MyController : BaseController 
{ 
    public MyController(SomeService service) : base(service) 
    { 
    } 
} 

是我想做的可能吗?

+0

听起来你的界面需要协变...'IBaseService '。这将无法编译,如果任何方法使用'TBaseUser'作为输入位置,当然... –

+0

@JonSkeet谢谢 - 我忽略提及协变 - 我不能使它协变,因为接口使用TBaseUser都返回&输入值。 – Sam

+1

在这种情况下,SomeService根本不实现'IBaseService ' –

回答

0

IBaseService -iterface必须covariant

interface IBaseService<out T> 

这样你就可以的IBaseService<User>一个实例分配给IBaseService<BaseUser>