【问题标题】:Implementing internal class with internal interface error使用内部接口错误实现内部类
【发布时间】:2013-08-08 14:48:26
【问题描述】:

为什么我不能这样做?

internal class InsuranceClientFactory : IInsuranceClientFactory
{
    internal Iws2SoapClient InsuranceClient()
    {

    }
}

internal interface IInsuranceClientFactory
{
  Iws2SoapClient InsuranceClient();
}

我得到错误:

无法实现接口成员,因为它不是公共的

有一些问题是类是公共的,但接口不是,但我的两个都是内部的。我不想在我的程序集之外公开这个类或接口。似乎是一个奇怪的限制。

这个问题C# internal interface with internal implementation,确实声明了“如果你隐式实现一个接口,我相信该成员必须被声明为公共的。”但这对我来说没有意义,为什么不能'你呢?似乎有道理?

【问题讨论】:

    标签: c# interface


    【解决方案1】:

    “我不想暴露这个类或接口......”那很好。

    但是该方法需要是公共的,即使它是公共的,它也不会在程序集之外可见,因为该类是内部的。

    如果您真的不希望它公开,您可以显式实现该方法。

    internal class InsuranceClientFactory : IInsuranceClientFactory
    {
        Iws2SoapClient IInsuranceClientFactory.InsuranceClient()
        {
    
        }
    }
    

    【讨论】:

    • 我自己才想出来的。虽然看起来很奇怪的语法?
    • 隐式实现接口的方法需要public,就是这样(耸耸肩)
    【解决方案2】:

    您必须将方法修饰符更改为public

    internal class InsuranceClientFactory : IInsuranceClientFactory
    {
        public Iws2SoapClient InsuranceClient()
        {
    
        }
    }
    

    公开该方法并不意味着可以公开访问它,因为DeclaringType 本身的internal 方法将仅具有内部访问权限。

    【讨论】:

    • 我自己才想出来的。虽然看起来很奇怪的语法?
    【解决方案3】:

    我可以告诉你为什么它不起作用。 C# 语言规范 5.0 第 13.4.4 节,接口映射。

    ... 非公共和静态成员都不参与接口映射...

    但是由于您尝试做的事情在技术上应该可行,因此优先考虑显式实现,并且您的实现可以保持internal

    并且不要分叉,但即使您显式实现内部接口,实现也不会是internal,它实际上是private/public,如规范前面所述(第 13.4.1 节显式接口成员实施):

    显式接口成员实现具有与其他成员不同的可访问性特征。因为在方法调用或属性访问中,显式接口成员实现永远无法通过其完全限定名称访问,所以它们在某种意义上是私有的。但是,由于它们可以通过接口实例访问,因此它们在某种意义上也是公共的。

    【讨论】:

      【解决方案4】:

      改成:

      internal class InsuranceClientFactory : IInsuranceClientFactory
      {
          public Iws2SoapClient InsuranceClient()
          {
      
          }
      }
      

      这个类仍然是内部的并且没有暴露接口。

      【讨论】:

        猜你喜欢
        • 2018-05-12
        • 2012-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多