2016-02-15 151 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>