Внутренний интерфейс 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;
}

Затем у меня есть класс:

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;
}

Чтобы сделать вещи еще более странными, я создал еще один внутренний класс называется Temp. Затем я попросил его реализовать интерфейс IScanner, и я скопировал и вставил в него реализацию из MyScanner, и она не компилируется, давая мне ошибку: «Не удается реализовать член интерфейса, потому что он не является общедоступным».

Может кто-нибудь объяснит это несоответствие?

Спасибо

(Обновлено, чтобы исправить опечатку и прояснить некоторый текст)

РЕДАКТИРОВАТЬ: Дополнительная информация

Я запустил код через отражатель, и мои реализации были скомпилированы как явные реализации, даже хотя они не являются явными. Рефлектор не показывает никаких признаков внутренних ключевых слов. Все, что я могу предположить, это то, что это своего рода сбой в компиляторе, который по какой-то причине позволил мне сделать их внутренними и неявными, и что он каким-то образом решил, что это явная реализация.

Я просматривал код несколько раз. Другого объяснения я найти не могу.

43
задан River 18 October 2017 в 02:59
поделиться