【问题标题】:Cannot understand the behaviour of C# compiler while instantiating a class thru interface通过接口实例化类时无法理解 C# 编译器的行为
【发布时间】:2010-05-05 04:54:58
【问题描述】:

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

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

实现接口的类是

public class RiskFactoryService : IRiskFactory
{
}

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

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

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

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

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”。存在显式转换(您是否缺少演员表?)

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

objIRiskFactory = (IRiskFactory)new RiskFactoryService();

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

【问题讨论】:

  • 也许我忽略了一些东西,但您没有从创建 RiskFactoryService 中得到 StackOverflowException ......无参数构造函数递归调用自身

标签: c#


【解决方案1】:

出现两种想法:

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

【讨论】:

    【解决方案2】:

    您的 Windows 服务类是否应该实际实现如下服务...

    public partial class RiskFactoryService : ServiceBase  , IRiskFactory
    {
    }
    

    为什么要在 RiskFactoryService 的构造函数中创建 RiskFactoryService,我认为这会导致堆栈溢出错误!!你可以简单地调用,this.StartService()...

    【讨论】:

      【解决方案3】:

      我认为问题在于,在这种情况下,RiskFactoryService 指的是部分类定义 RiskFactoryService :不实现 IRiskFactory 的 ServiceBase(您的意思是该类与实现 IRiskFactory 的 RiskFactoryService 类相同吗? - 如果是这样该类定义可能也应该标记为部分)。

      我看到的一个更紧迫的问题是,您在其内部递归地调用 RiskFactoryService 类的构造函数。这意味着每次您尝试实例化 RiskFactoryService 时,堆栈都会溢出。

      【讨论】:

        猜你喜欢
        • 2021-05-27
        • 1970-01-01
        • 2013-03-13
        • 2019-12-02
        • 2017-03-15
        • 1970-01-01
        • 1970-01-01
        • 2015-08-02
        • 2011-11-25
        相关资源
        最近更新 更多