Skip to main content
 首页 » 编程设计

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

2024年02月24日19davidwang456

我有一个实现接口(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 吗?