为什么我不能这样做?
internal class InsuranceClientFactory : IInsuranceClientFactory
{
internal Iws2SoapClient InsuranceClient()
{
}
}
internal interface IInsuranceClientFactory
{
Iws2SoapClient InsuranceClient();
}
我收到错误:
无法实现接口成员,因为它不是公共
有几个问题,班级是公开的,但界面不是,但我的两个都是内部的。我不想在程序集之外公开这个类或接口。似乎有一个奇怪的限制。
这个问题C# internal interface with internal implementation,确实陈述“如果你隐式实现了一个接口,我相信该成员必须被公开。”但这对我来说没有意义,为什么不是吗?似乎有道理?
答案 0 :(得分:3)
“我不想暴露这个类或接口......”那很好。
但该方法需要公开,即使它是公开的,它也不会在程序集外部可见,因为该类是内部的。
如果你真的不希望它公开,你可以明确地实现该方法。
internal class InsuranceClientFactory : IInsuranceClientFactory
{
Iws2SoapClient IInsuranceClientFactory.InsuranceClient()
{
}
}
答案 1 :(得分:2)
您必须将方法修饰符更改为public
internal class InsuranceClientFactory : IInsuranceClientFactory
{
public Iws2SoapClient InsuranceClient()
{
}
}
将该方法设为公开并不意味着可以公开访问该方法,因为DeclaringType
本身internal
方法仅具有内部访问权限。
答案 2 :(得分:1)
将其更改为:
internal class InsuranceClientFactory : IInsuranceClientFactory
{
public Iws2SoapClient InsuranceClient()
{
}
}
该类仍然是内部的,并且没有公开该接口。
答案 3 :(得分:1)
我可以告诉你为什么它不起作用。 C#语言规范5.0第13.4.4节,接口映射。
......非公共成员和静态成员都不参与界面映射...
但是因为您尝试做的事情应该在技术上有效,所以显式实现优先,您的实现可以保持internal
并且不分裂,但即使您明确地实施内部接口,实现也不会internal
它实际上是private
/ public
,如规范前面所述(第13.4.1节显式接口成员实现):
显式接口成员实现具有与其他成员不同的可访问性特征。因为显式接口成员实现永远不能通过方法调用或属性访问中的完全限定名来访问,所以它们在某种意义上是私有的。但是,由于它们可以通过接口实例访问,因此它们在某种意义上也是公开的。