C#内部接口与内部实现
我碰到了一些我不太了解的东西。
我有一个项目,我有一个内部的接口。 实现该接口的类也是内部的。 在接口的实现中,我把所有实现的成员都放在内部。 我没有做一个明确的实施。
我有两个接口和两个类来实现这些工作正常的接口。
它看起来像这样:
internal interface IA { void X(); }
接着
internal class CA : IA { internal void X() { ... } }
这对于上述两个类来说工作得很好。 但是当我试图用另一个接口和类来做到这一点时,这是行不通的。 事实上,对于上面的例子,我得到的错误:
“WindowsFormsApplication1.CA”不实现接口成员“WindowsFormsApplication1.IA.X()”。 'WindowsFormsApplication1.CA.X()'不能实现一个接口成员,因为它不公开。
我意识到我可以公开的方法或做一个明确的实现(并省略内部和公共修饰符),但我只是困惑,为什么它与两个类的工作,但我似乎无法复制它在任何地方。
对代码进行一些处理(因为它是保密的),这是我的项目中真正起作用的代码之一。
internal interface IScanner { void SetHardware(Hardware hardware); void Start(); void PauseScan(); void ResumeScan(); void Stop(); bool InScan { get; } event ScanCompleteHandler ScanComplete; }
然后我有class:
internal class MyScanner : IScanner { internal void SetHardware(Hardware hardware) { ... } internal void Start() { ... } internal void Stop() { ... } internal void PauseScan() { ... } internal void ResumeScan() { ... } internal bool InScan { get { ... } } internal event ScanCompleteHandler ScanComplete; }
为了让事情变得更奇怪,我创build了另一个名为Temp的内部类。 然后我实现了IScanner接口,并将MyScanner的实现复制粘贴到它上面,它不会编译,给我的错误是:“不能实现一个接口成员,因为它不公开。
任何人都可以解释这种不一致?
谢谢
(更新以修复打字错误并澄清一些文字)
编辑:其他信息
我通过reflection器运行代码,我的实现已经被编译为显式实现,即使它们不是显式的。 reflection器没有显示内部关键字的迹象。 我只能猜测,这是编译器中的一个小故障,出于某种原因,我允许我们使它们成为内在的和隐含的,并以某种方式解决了这个问题,因为它是一个明确的实现。
我已经多次查看代码。 我找不到任何其他的解释。
如果你隐式地实现一个接口,我相信这个成员必须被公开。 在您的示例中, CA
尝试隐式实现X()
方法,但未声明为公共。 如果你想保持内部的X()
,那么你应该使用显式的接口实现。
internal void IA.X() { /* stuff */ }
不过,我还要补充一点,公开使用X()
方法不会造成任何伤害,因为类是内部的,所以成员已经被访问修饰符限制了…也就是说,它已经是有效的内部…所以你不妨把它公开!
我知道这个问题已经有一段时间了,但也许我可以点亮一下。 根据这里发现的C#语言规范,你所描述的行为不应该是可能的。 因为根据20.4.2接口映射,据说实现是显式的或映射到公共非静态成员。 所以要么你有其他的场景,而是你在这里描述的场景,或者你在编译器中发现了一个bug。
可能你的“Temp”级是公开的,IScanner是内部的。 这就是你得到这个错误的原因。 我认为这非常恼人,因为你被迫明确地实现它,你不能指定它们为抽象的或虚拟的。 对于虚拟的东西,我不得不做一个隐式的内部虚拟实现相同的API,然后从显式调用隐式版本。 丑陋。
据我所知,你不能实现internal
接口方法。 正如你所说的,你可以明确地实现它们,但是之后有人仍然可以((IScanner)myScanner).SetHardware(hw)
你是否100%确定你的MyScanner
实现不这样做:
internal class MyScanner : IScanner { void IScanner.SetHardware(Hardware hardware) { this.SetHardware(hardware); } internal void SetHardware(Hardware hardware) { ... } .... }
或这个:
internal partial class MyScanner : IScanner { internal void SetHardware(Hardware hardware) { ... } } internal partial class MyScanner { void IScanner.SetHardware(Hardware hardware) { this.SetHardware(hardware); } }