Я абсолютно уверен, что это не делает ни одной из вещей, которые вы показали. Второй явной реализации не существует, и в ней нет частичных классов. Я согласен, насколько мне известно, то, что я сделал, не должно быть возможным, основываясь на исследованиях, которые я провел с тех пор, и все же код есть, и он компилируется и выполняется так, как я ожидал. Однако мне пришла в голову блестящая идея взглянуть на код в отражателе, и оказалось, что скомпилированный код имеет явную реализацию, хотя реальный код не является явным. Интересно...
лкнулся с чем-то, чего я действительно не понимаю.
У меня есть проект, где у меня есть внутренний интерфейс. Класс, реализующий этот интерфейс, также является внутренним. В реализации интерфейса я делаю все элементы, которые я реализую, внутренними. Я не делал явную реализацию.
У меня есть два интерфейса и два класса, которые реализуют те интерфейсы, где это работает нормально.
Это будет выглядеть примерно так:
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, и она не скомпилируется, что выдает мне ошибку: «не могу реализовать элемент интерфейса, потому что он не является общедоступным».
Кто-нибудь может объяснить это несоответствие?
Спасибо
(Обновлено для исправления опечатки и уточнения текста)
РЕДАКТИРОВАТЬ: Дополнительная информация
Я пропустил код через рефлектор, и мои реализации были скомпилированы как явные реализации, хотя они не являются явными. Отражатель не показывает никаких признаков внутренних ключевых слов. Все, что я могу догадаться, это то, что это какой-то сбой в компиляторе, который по какой-то причине позволил мне сделать их внутренними и неявными, и что он каким-то образом решил, что это явная реализация.
Я просмотрел код несколько раз. Я не могу найти другого объяснения этому.