Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么实现接口的对象不能在服务注入时转换为类型?_C#_Asp.net_.net_Asp.net Core - Fatal编程技术网

C# 为什么实现接口的对象不能在服务注入时转换为类型?

C# 为什么实现接口的对象不能在服务注入时转换为类型?,c#,asp.net,.net,asp.net-core,C#,Asp.net,.net,Asp.net Core,我在注入方面遇到问题,因为无法将OneSignalClient转换为类型ipusnotificationclientOneSignalClient实现IOneSignalClient和IOneSignalClient实现ipusnotificationclient。但为什么它不被转换呢 我有这样的代码结构,可以像这样注入推送通知 services.AddScoped( typeof(IPushNotificationClient<ICreateNotificationEnd

我在注入方面遇到问题,因为无法将
OneSignalClient
转换为类型
ipusnotificationclient
OneSignalClient
实现
IOneSignalClient
IOneSignalClient
实现
ipusnotificationclient
。但为什么它不被转换呢

我有这样的代码结构,可以像这样注入推送通知

services.AddScoped(
        typeof(IPushNotificationClient<ICreateNotificationEndpoint<CreateNotificationResponse, CreateNotification>>),
        f => new OneSignalClient(
            this.Configuration.GetSection("OneSignalSettings")["Endpoint"],
            this.Configuration.GetSection("OneSignalSettings")["AppId"],
            new HttpClientHandler()));
services.AddScoped(
类型(IPushNotificationClient),
f=>新的OneSignalClient(
this.Configuration.GetSection(“OneSignalSettings”)[“Endpoint”],
this.Configuration.GetSection(“OneSignalSettings”)[“AppId”],
新的HttpClientHandler());
下面是结构图

public class OneSignalClient : IOneSignalClient
{
    public OneSignalClient(string apiEndpoint, string appId, IHttpClientHandler httpClient)
    {
        this.CreateNotification = new CreateNotificationEndpoint(apiEndpoint, appId, httpClient);
    }

    public ICreateNotificationEndpoint CreateNotification { get; private set; }
}
public interface IOneSignalClient: IPushNotificationClient<ICreateNotificationEndpoint>
{
}
public interface ICreateNotificationEndpoint:
    PushNotification.Endpoints.ICreateNotificationEndpoint<CreateNotificationResponse, CreateNotification>
{
}
public interface IPushNotificationClient<TCreate>
{
    TCreate CreateNotification { get; }
}

//service
public class PushNotificationService : IPushNotificationService{
    private readonly IPushNotificationClient<ICreateNotificationEndpoint<CreateNotificationResponse, CreateNotification>> pnsClient;
    public PushNotificationService(IPushNotificationClient<ICreateNotificationEndpoint<CreateNotificationResponse, CreateNotification>> pnsClient)
    {
      this.pnsClient = pnsClient;
    }
}
公共类OneSignalClient:OneSignalClient
{
public OneSignalClient(字符串apiEndpoint、字符串appId、IHttpClientHandler httpClient)
{
this.CreateNotification=新的CreateNotificationEndpoint(apiEndpoint、appId、httpClient);
}
公共ICreateNotificationEndpoint CreateNotification{get;private set;}
}
公共接口客户端:IPushNotificationClient
{
}
公共接口ICreateNotificationEndpoint:
PushNotification.Endpoints.ICreateNotificationEndpoint
{
}
公共接口IPushNotificationClient
{
TCreate CreateNotification{get;}
}
//服务
公共类PushNotificationService:IPushNotificationService{
私有只读iPusNotificationClient pnsClient;
公共推送通知服务(IPushNotificationClient pnsClient)
{
this.pnsClient=pnsClient;
}
}

ipusnotificationclient
无法转换为
ipusnotificationclient
。这显然不是一场比赛

但是您的
ICreateNotificationEndpoint
派生自
ICreateNotificationEndpoint
,这是两种不同的接口类型

只要决定在任何地方使用哪个界面,不要混淆它们。 您没有在此处定义别名

public interface ICreateNotificationEndpoint:
PushNotification.Endpoints.ICreateNotificationEndpoint<CreateNotificationResponse, CreateNotification>
公共接口ICreateNotificationEndpoint:
PushNotification.Endpoints.ICreateNotificationEndpoint
这是一个新的类型定义,使事情变得不兼容


除非你想尝试使用协方差或逆方差,但为什么要把事情弄得复杂。

为你的未来利益上一节术语课。类/结构不继承接口,而是实现接口。仅仅因为两种类型表现出特定的继承/实现关系,这并不意味着在这两种类型上参数化的泛型表现出相同的关系。