Pet*_*ete 43 c# interface internal
我发现了一些我不太懂的东西.
我有一个项目,我有一个内部接口.实现该接口的类也是内部的.在接口的实现中,我制作了我实现的所有成员,内部.我没有做一个明确的实现.
我有两个接口和两个类来实现这些工作正常的接口.
它看起来像这样:
internal interface IA
{
void X();
}
Run Code Online (Sandbox Code Playgroud)
然后
internal class CA : IA
{
internal void X()
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
这适用于前面提到的两个类.但是当我尝试用另一个接口和类做它时,它不起作用.事实上,对于上面的例子,我得到错误:
'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;
}
Run Code Online (Sandbox Code Playgroud)
然后我上课了:
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;
}
Run Code Online (Sandbox Code Playgroud)
为了使事情更奇怪,我创建了另一个名为Temp的内部类.然后我让它实现了IScanner接口,我将MyScanner的实现复制并粘贴到它上面,它不会编译,给我一个错误:"无法实现接口成员,因为它不公开."
任何人都能解释这种不一致吗?
谢谢
(更新以修正拼写错误并澄清一些文字)
编辑:附加信息
我通过反射器运行代码,我的实现已被编译为显式实现,即使它们不是显式的.反射器没有显示内部关键字的迹象.我可以猜到的是,这是编译器中的某种故障,由于某种原因,它允许我使它们内部和隐式,并且它以某种方式解决了它作为一个显式实现.
我已多次查看代码了.我找不到任何其他解释.
Red*_*dog 20
如果您隐式实现接口,我认为该成员必须声明为public.在您的示例中,CA
尝试隐式实现该X()
方法但未声明为public.如果你想保持X()
内部,那么你应该使用显式接口实现.
void IA.X() { /* stuff */ }
Run Code Online (Sandbox Code Playgroud)
但是,我还要补充说,将X()
方法公之于众不会造成任何伤害,因为类是内部的,因此成员已经受到该访问修饰符的限制......也就是说,它已经是有效的内部...所以你可能还要把它公之于众!
据我所知,您无法实现接口方法internal
。正如您所说,您可以明确地实现它们,但有人仍然可以这样做((IScanner)myScanner).SetHardware(hw)
您是否 100% 确定您的MyScanner
实现不会执行以下操作:
internal class MyScanner : IScanner
{
void IScanner.SetHardware(Hardware hardware) { this.SetHardware(hardware); }
internal void SetHardware(Hardware hardware)
{
...
}
....
}
Run Code Online (Sandbox Code Playgroud)
或这个:
internal partial class MyScanner : IScanner
{
internal void SetHardware(Hardware hardware)
{
...
}
}
internal partial class MyScanner
{
void IScanner.SetHardware(Hardware hardware)
{
this.SetHardware(hardware);
}
}
Run Code Online (Sandbox Code Playgroud)