无法从简单 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 件事才能完成这项工作

  1. RegisterIBaseService<ICapability>而不是BaseService<ICapability>
  2. 通过将通用类型标记为 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
{
}

实例:https://dotnetfiddle.net/O0yXa5