不能将具有泛型的扩展接口分配给父C#

时间:2019-06-30 11:02:49

标签: c# oop generics inheritance interface

有一个继承通用接口的接口。

这是通用界面

public interface IBaseService<TEntity> where TEntity : BaseEntity
{
}

继承通用接口的接口

public interface IChatService :IBaseService<Messages>
{
}

然后我有一个类,该类将构造函数中的通用接口作为参数。

public class BaseApi
{
    IBaseService<BaseEntity> _baseService;

    public BaseApi(IBaseService<BaseEntity> baseService)
    {
        _baseService = baseService;
    }
}

当我传递实现通用接口的接口对象时,不允许我传递接口的对象,它要求传递通用接口。

这是错误: enter image description here 有什么办法吗? 在此先感谢您,英语不好!

3 个答案:

答案 0 :(得分:2)

这很合逻辑。通过重命名我们的类型并创建一个新示例,可以简化一些事情:

public class BaseApi
{
    public BaseApi(IBucket<Fruit> baseService) { ... }
}

我们的IBucket<Messages>代表一种具体类型的水果(苹果):

public interface IChatService :IBucket<Apple>
{
}

一桶苹果与一桶水果并不相同,因为您可以在后者中放一个橙子,而对前者则不能这样做。

要解决此问题,您可以更改IChatService的签名:

public interface IChatService :IBaseService<BaseEntity>
{
}

或将预期的IBaseService<Messages>类型传递给BaseApi的控制器。

答案 1 :(得分:0)

您可以使用协方差来解决此问题。但前提是您的论据可以协变

public interface IBaseService<out TEntity> where TEntity : BaseEntity
{
}

https://docs.microsoft.com/en-us/dotnet/standard/generics/covariance-and-contravariance

答案 2 :(得分:-1)

看看这个:

public class BaseEntity
{
    public int Id { get; set; }
    public DateTime CreatedDate { get; set; }
}

public class Message : BaseEntity
{
    public string Text { get; set; }
}

public interface IBaseService<TEntity> where TEntity : BaseEntity
{
    string LogicalDelete();
}

public interface IChatService : IBaseService<Message>
{
    bool SendMessage();
}

public class BaseApi<TEntity> : IBaseService<TEntity> where TEntity : BaseEntity
{
    public BaseApi()
    {
        // You access to parent
    }

    public string LogicalDelete()
    {
        // Do somethins
    }
}