【问题标题】:Can't convert interface to concrete interface无法将接口转换为具体接口
【发布时间】:2022-11-29 00:27:51
【问题描述】:

为什么我不能转换具体实现通用接口的接口实现?我需要 Cat、Dog 等自己的接口实现。

public interface IMarker {}
public class ResultA : IMarker {//some code}
public class ResultB : IMarker {//some code}

public interface IService<T> where T : IMarker
{
    public List<T> DoStuff();
}

public interface ICatService : IService<ResultA> {//some code}
public interface IDogService : IService<ResultB> {//some code}

public class CatService : ICatService
{
    public List<ResultA> DoStuff() { return new List<ResultA>();}
}

public class DogService : IDogService
{
    public List<ResultB> DoStuff() {return new List<ResultB>();}
}

public abstract class Animal
{
    protected readonly IService<IMarker> _svc;

    protected Animal(IService<IMarker> svc)
    {
        _svc = svc;
    }
}
public class Cat(ICatService svc) : base(svc){}
public class Dog(IDogService svc) : base(svc){}

CS1503 参数 2:无法从“ICatService”转换为“IService”

我有 DI 服务,即:

services.AddTransient<ICatService, CatService>();

【问题讨论】:

  • 请为Cat 添加基类。您的原始代码没有重现该问题。

标签: c#


【解决方案1】:

CatService 没有实现 ICatService,即 ICatService 仅继承 IService&lt;ResultA&gt; 并不意味着它们相同,C# is strongly-typed(主要是:-)语言和编译器会认为这两个接口是不同的接口(虽然相关)。您需要使 CatService 实现 ICatService

public class CatService : ICatService
{
    // ...
}

或者注册并解析IService&lt;ResultA&gt;接口(基本上完全跳过中间接口):

services.AddTransient<IService<ResultA>, CatService>();

// ...

public Cat(IService<ResultA> svc) : base(svc){}

【讨论】:

  • 抱歉搞混了,其实我的意思是:CatService 实现了实现 IService<ResultA> 的 ICatService。在这种情况下,我得到了这个错误。
  • @TryHard 什么是base(svc)Cat 的基类是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-08
  • 1970-01-01
  • 1970-01-01
  • 2013-08-25
  • 2012-10-11
  • 1970-01-01
  • 2014-09-01
相关资源
最近更新 更多