无法从简单 class 结构中的错误转换
Cannot Convert from error in simple class structure
我有以下 class 关系
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 并再次转换,但随后出现运行时错误。
请注意,自发布此答案以来,问题已更新 - 协方差不再是添加不兼容方法的选项
您需要做 2 件事才能完成这项工作
- 让
Register
取IBaseService<ICapability>
而不是BaseService<ICapability>
- 通过将通用类型标记为
out
使 IBaseService
协变 - 这与您可以将 List<Foo>
传递给需要 [=18= 的 merthod 的原因相同] 因为 IEnumerable<T>
以类似的方式协变。
public class ServiceResolver
{
public void Register(IBaseService<ICapability> serviceToRegister)
{
}
}
和
public interface IBaseService<out T>
where T : ICapability
{
}
我有以下 class 关系
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 并再次转换,但随后出现运行时错误。
请注意,自发布此答案以来,问题已更新 - 协方差不再是添加不兼容方法的选项
您需要做 2 件事才能完成这项工作
- 让
Register
取IBaseService<ICapability>
而不是BaseService<ICapability>
- 通过将通用类型标记为
out
使IBaseService
协变 - 这与您可以将List<Foo>
传递给需要 [=18= 的 merthod 的原因相同] 因为IEnumerable<T>
以类似的方式协变。
public class ServiceResolver
{
public void Register(IBaseService<ICapability> serviceToRegister)
{
}
}
和
public interface IBaseService<out T>
where T : ICapability
{
}