实现内部类时出现内部接口错误

本文关键字:内部 接口 错误 内部类 实现 | 更新日期: 2023-09-27 18:26:50

为什么我不能这样做?

internal class InsuranceClientFactory : IInsuranceClientFactory
{
    internal Iws2SoapClient InsuranceClient()
    {
    }
}
internal interface IInsuranceClientFactory
{
  Iws2SoapClient InsuranceClient();
}

我得到错误:

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

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

这个问题是带有内部实现的C#内部接口,是否声明"如果你隐式实现了一个接口,我认为该成员必须声明为公共。"但这对我来说没有意义,你为什么不能呢?似乎有道理?

实现内部类时出现内部接口错误

"我不想公开这个类或接口…"等等。

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

如果你真的不想让它公开,你可以显式地实现这个方法。

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

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

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

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

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

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

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

不要吹毛求疵,但即使您显式实现内部接口,实现也不会是internal——实际上是private/public,如规范前面所述(第13.4.1节显式接口成员实现):

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

将其更改为:

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

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