3

为什么我不能这样做?

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

    }
}

internal interface IInsuranceClientFactory
{
  Iws2SoapClient InsuranceClient();
}

我得到错误:

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

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

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

4

4 回答 4

3

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

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

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

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

    }
}
于 2013-08-08T14:52:09.080 回答
2

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

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

    }
}

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

于 2013-08-08T14:51:50.773 回答
1

将其更改为:

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

    }
}

该类仍然是内部的,并且没有公开接口。

于 2013-08-08T14:52:26.570 回答
1

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

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

但是因为您尝试做的事情在技术上应该可行,所以显式实现优先,您的实现可以保留internal

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

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

于 2013-08-08T15:32:14.617 回答