gpt4 book ai didi

c# - 通过接口(interface)实例化类时无法理解 C# 编译器的行为

转载 作者:太空宇宙 更新时间:2023-11-03 22:21:59 25 4
gpt4 key购买 nike

我有一个实现接口(interface)的类。界面是

public interface IRiskFactory
{
void StartService();
void StopService();
}

实现接口(interface)的类是

public class RiskFactoryService : IRiskFactory
{
}

现在我有一个控制台应用程序和一个窗口服务。

如果我编写以下代码,则从控制台应用程序

static void Main(string[] args)
{
IRiskFactory objIRiskFactory = new RiskFactoryService();
objIRiskFactory.StartService();
Console.ReadLine();
objIRiskFactory.StopService();
}

它工作正常。但是,当我在窗口服务中编写相同的代码时

public partial class RiskFactoryService : ServiceBase
{
IRiskFactory objIRiskFactory = null;
public RiskFactoryService()
{
InitializeComponent();
objIRiskFactory = new RiskFactoryService(); <- ERROR
}

/// <summary>
/// Starts the service
/// </summary>
/// <param name="args"></param>
protected override void OnStart(string[] args)
{
objIRiskFactory.StartService();
}

/// <summary>
/// Stops the service
/// </summary>
protected override void OnStop()
{
objIRiskFactory.StopService();
}
}

它抛出错误:无法将类型“RiskFactoryService”隐式转换为“IRiskFactory”。存在显式转换(是否缺少强制转换?)

当我输入转换为接口(interface)类型时,它开始工作

objIRiskFactory = (IRiskFactory)new RiskFactoryService();

我的问题是为什么会这样?

最佳答案

有两种想法:

  • 如果您使用 partial 将类型的服务/接口(interface)部分放在单独的文件中(因为代码提到了 partial 并且似乎没有实现接口(interface)本身)命名空间是否正确?对于 partial 类,很容易意外地最终创建两种类型而不是一种类型
  • IRiskFactory 是否遇到解析问题(可能是因为有引用的 dll 和本地副本)?即所有代码都在谈论相同 IRiskFactory 吗?

关于c# - 通过接口(interface)实例化类时无法理解 C# 编译器的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2770706/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com