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

лкнулся с чем-то, чего я действительно не понимаю.

У меня есть проект, где у меня есть внутренний интерфейс. Класс, реализующий этот интерфейс, также является внутренним. В реализации интерфейса я делаю все элементы, которые я реализую, внутренними. Я не делал явную реализацию.

У меня есть два интерфейса и два класса, которые реализуют те интерфейсы, где это работает нормально.

Это будет выглядеть примерно так:

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, и она не скомпилируется, что выдает мне ошибку: «не могу реализовать элемент интерфейса, потому что он не является общедоступным».

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

Спасибо

(Обновлено для исправления опечатки и уточнения текста)

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

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

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

Ответы на вопрос(5)

Ваш ответ на вопрос