我有以下班級關系
public interface ICapability
{
}
public interface IBaseService<T> where T : ICapability
{
}
public abstract class BaseService<out T> : IBaseService<T> where T : ICapability
{
// modified...
T MapEventToCapability(dynamic eventData, T capability);
}
public class SomeCapability : ICapability
{
}
public partial class Service1 : BaseService<SomeCapability>
{
public Service1()
{
}
}
public class ServiceResolver
{
public void Register(BaseService<ICapability> serviceToRegister)
{
}
}
我嘗試呼叫 Register 方法,傳入一個新的 service1,如下所示:
var b = new ServiceResolver();
var c = new Service1();
b.Register(c);
但是,我在呼叫 Register 時在 c 上遇到編譯時錯誤,如下所示;
Cannot convert Service1 to BaseService<ICapability>
我假設因為 Service1 是 BaseService 型別,并且由于 SomeCapability 是 ICapability 型別,所以這不是問題。
我也嘗試轉換為 BaseService 我嘗試將 Register 上的輸入引數更改為 IBaseService 并再次轉換,但隨后出現運行時錯誤。
uj5u.com熱心網友回復:
請注意,自發布此答案以來,該問題已更新-協方差不再是添加了不兼容方法的選項
你需要做兩件事才能完成這項作業
- 請
Register采取IBaseService<ICapability>不BaseService<ICapability> IBaseService通過將泛型型別標記為來使協變out- 這與您可以將 a 傳遞List<Foo>給期望IEnumerable<Foo>asIEnumerable<T>以類似方式協變的方法的原因相同。
public class ServiceResolver
{
public void Register(IBaseService<ICapability> serviceToRegister)
{
}
}
和
public interface IBaseService<out T>
where T : ICapability
{
}
現場示例:https : //dotnetfiddle.net/O0yXa5
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/407838.html
標籤:
下一篇:在java中繼承多個抽象類
