C#内部接口与内部实现

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()方法公之于众不会造成任何伤害,因为类是内部的,因此成员已经受到该访问修饰符的限制......也就是说,它已经是有效的内部...所以你可能还要把它公之于众!

  • 我说它是让我为两个实现两个接口的类做的,但不是为了其他任何接口.也就是说,它允许它在两个地方,但不允许它.我的问题是,为什么不一致? (4认同)
  • 我的问题不是如何做到这一点.我明白应该怎么做.我的问题是关于不一致性以及为什么编译器允许我隐式地将接口成员实现为这两个类的内部,当它显然不应该时. (2认同)
  • 拥有一个带有“公共 mymethod”的“内部 myclass”让我失望。但它有效。去搞清楚。 (2认同)

S. *_*rws 10

我知道这个问题已经有一段时间了,但也许我可以解释一下。根据此处找到的 C# 语言规范,您描述的行为应该是不可能的。因为在 20.4.2 接口映射下,据说实现是显式的或映射到公共非静态成员。因此,要么您有其他场景而不是您在此处描述的场景,要么您在编译器中发现了一个错误 :)。

  • 这应该被标记为这个问题的答案。 (2认同)

Chr*_*Wue 2

据我所知,您无法实现接口方法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)