Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
В этой статье рассматриваются следующие ошибки компилятора:
- CS0071: явная реализация интерфейса события должна использовать синтаксис метода доступа к событиям.
- CS0106: модификатор недействителен для этого элемента.
- CS0277: Член не реализует интерфейсный элемент, так как он не является общедоступным.
- CS0425: ограничения для параметра типа метода должны соответствовать ограничениям для параметра типа метода интерфейса. Вместо этого рекомендуется использовать явную реализацию интерфейса.
- CS0460: ограничения для переопределения и явных методов реализации интерфейса наследуются от базового метода, поэтому они не могут быть указаны напрямую, за исключением класса или ограничения структуры.
- CS0470: Метод не может реализовать аксессор интерфейса для типа. Используйте явную реализацию интерфейса.
- CS0473: явная реализация интерфейса "имя метода" соответствует нескольким членам интерфейса. Какой элемент интерфейса на самом деле выбран, зависит от реализации. Вместо этого рекомендуется использовать неявную реализацию.
- CS0531: элементы интерфейса не могут иметь определение.
- CS0535: Элемент не реализует интерфейсного элемента.
- CS0538: элемент в явном объявлении интерфейса не является интерфейсом.
- CS0539: Элемент, указанный в явном объявлении интерфейса, не найден среди членов интерфейса, которые могут быть реализованы.
- CS0540: содержащий тип не реализует член интерфейса.
- CS0541: явное объявление интерфейса можно объявить только в классе, записи, структуре или интерфейсе.
- CS0550: член добавляет метод доступа, не найденный в элементе интерфейса.
- CS0551: явная реализация интерфейса не содержит аксессор.
- CS0630: член не может реализовать член интерфейса, так как он имеет параметр __arglist.
- CS0686: Акцессор не может реализовать член интерфейса. Используйте средство для явной реализации интерфейса.
- CS0736: член не реализует член интерфейса экземпляра. Он не может реализовать член интерфейса, так как он является статическим.
- CS0737: член не реализует член интерфейса. Он не может реализовать член интерфейса, так как он не является общедоступным.
- CS0738: Метод не реализует метод интерфейса. Это невозможно, так как он не имеет совпадающего типа возвращаемого значения.
- CS8705: член интерфейса не имеет наиболее конкретной реализации. Ни член не является наиболее конкретным.
- CS8854: член не реализует член интерфейса.
- CS9333: тип параметра должен совпадать с реализованным элементом.
- CS9334: тип возвращаемого значения должен совпадать с реализованным элементом.
Объявление интерфейса и синтаксис
Следующие ошибки связаны с правильным синтаксисом и структурой при объявлении явных реализаций интерфейса:
- CS0071: явная реализация события через интерфейс должна использовать синтаксис аксессоров событий.
- CS0106: модификатор недействителен для этого элемента.
- CS0531: элементы интерфейса не могут иметь определение.
- CS0538: элемент в явном объявлении интерфейса не является интерфейсом.
- CS0541: явное объявление интерфейса можно объявить только в классе, записи, структуре или интерфейсе.
Эти ошибки можно исправить с помощью следующих методов:
- Необходимо вручную предоставить
addиremoveметоды доступа к событиям при явной реализации события интерфейса (CS0071). Компилятор не создает эти методы доступа для явных реализаций интерфейса, поэтому необходимо явно определить их, чтобы указать способ хранения и управления событием. -
publicУдалите модификатор из явных реализаций интерфейса (CS0106). Явные реализации интерфейса неявно открыты при доступе через тип интерфейса, что делаетpublicключевое слово избыточным и недопустимым в этом контексте. -
abstractУдалите модификатор из явных реализаций интерфейса (CS0106). Явные реализации интерфейса предоставляют фактическую реализацию и не могут быть помечены как абстрактные, так как они не могут быть переопределены в производных классах. - Удалите текст метода из объявлений элементов интерфейса или переместите реализацию в класс или структуру, реализующую интерфейс (CS0531). Перед C# 8.0 члены интерфейса не могут содержать реализации; начиная с C# 8.0, можно предоставить методы интерфейса по умолчанию с помощью определенного синтаксиса.
- Убедитесь, что тип, указанный в объявлении явного интерфейса, является фактическим типом интерфейса (CS0538). В явном синтаксисе реализации интерфейса можно использовать только типы интерфейсов; попытка использовать класс или другой тип, отличный от интерфейса, нарушает явные правила реализации.
- Переместите явные объявления интерфейса в класс или структуру, которые определяют интерфейс в их списке базовых классов (CS0541). Явные реализации интерфейса должны отображаться в тексте класса или типа структуры и не могут быть объявлены на уровне пространства имен или в других контекстах.
Дополнительные сведения см. в разделе "Интерфейсы", "Явная реализация интерфейса" и " Реализация событий интерфейса".
Возвращаемые типы и сигнатуры
Следующие ошибки возникают, когда подпись реализуемого метода не соответствует объявлению члена интерфейса:
- CS0738: Этот член не реализует член интерфейса. Это невозможно, поскольку у него отсутствует соответствующий тип возвращаемого значения.
- CS8854: член не реализует член интерфейса.
- CS9333: тип параметра должен совпадать с реализованным элементом.
- CS9334: тип возвращаемого значения должен совпадать с реализованным элементом.
Эти ошибки можно исправить с помощью следующих методов:
- Измените тип возвращаемого метода реализации, чтобы точно совпадать с типом возврата, объявленным в члене интерфейса (CS0738, CS9334). Подпись реализации должна точно соответствовать объявлению интерфейса, так как подпись метода является частью контракта, определяющего, какой элемент интерфейса реализуется.
- Убедитесь, что типы параметров в методе реализации точно соответствуют типам параметров, объявленным в члене интерфейса (CS9333). Каждый параметр должен иметь одинаковый тип в той же позиции, что и в объявлении интерфейса, так как типы параметров являются основными компонентами сигнатуры метода, используемой компилятором для сопоставления реализаций с элементами интерфейса.
- Добавьте аксессор
initк свойству реализации, когда свойство интерфейса объявляет сеттерinit(CS8854). Ключевоеinitслово разрешает инициализацию свойств во время создания объекта, предотвращая изменение после этого, и свойство реализации должно обеспечить такое же поведение, доступное только для инициализации, чтобы удовлетворить контракт интерфейса.
Дополнительные сведения см. в разделах "Интерфейсы", "Свойства" и "Только для инициализации сеттеры".
Отсутствующие или неполные реализации
Следующие ошибки возникают, когда класс не может полностью реализовать интерфейс или реализует элементы, которые не соответствуют контракту интерфейса:
- CS0535: член не реализует член интерфейса.
- CS0550: Член добавляет аксессор, отсутствующий в элементе интерфейса.
- CS0551: В явной реализации интерфейса отсутствует аксессор.
Эти ошибки можно исправить с помощью следующих методов:
- Предоставьте реализацию для каждого члена, объявленного в интерфейсе, или объявите тип как
abstract(CS0535). Каждый элемент должен быть реализован для удовлетворения требований к интерфейсу. - Удалите все методы доступа реализующего свойства, которые не объявлены в свойстве интерфейса (CS0550). Свойство реализации может включать только методы доступа, явно объявленные в определении интерфейса, гарантируя, что реализация не добавляет функциональные возможности за рамки того, что указывает контракт интерфейса.
- Добавьте все необходимые методы доступа к явной реализации интерфейса, чтобы соответствовать объявлению интерфейса (CS0551). Каждый метод доступа, объявленный в интерфейсе, должен иметь соответствующий метод доступа в реализации с соответствующими сигнатурами, так как реализация должна выполнять полный контракт доступа, определенный интерфейсом.
Дополнительные сведения см. в разделе "Интерфейсы и свойства".
Сопоставление и разрешение участников
Следующие ошибки возникают при попытке реализовать элементы интерфейса, которые не существуют в интерфейсе или когда содержащий тип не объявляет интерфейс:
- CS0539: элемент в явном объявлении интерфейса не найден среди членов интерфейса, которые можно реализовать.
- CS0540: содержащий тип не реализует член интерфейса.
Эти ошибки можно исправить с помощью следующих методов:
- Убедитесь, что имя члена и подпись в явной реализации интерфейса точно соответствуют члену, объявленному в интерфейсе, или удалите неправильную реализацию (CS0539). Элемент, который вы пытаетесь реализовать, должен фактически существовать в определении этого интерфейса с соответствующим именем, возвращаемым типом и типами параметров, так как явная реализация интерфейса требует точного соответствия контрактом интерфейса.
- Добавьте интерфейс в базовый список класса или структуры или удалите явную реализацию интерфейса (CS0540). Тип может явно реализовать члены интерфейсов, объявленные в списке наследования, поэтому тип реализации должен установить связь интерфейса, прежде чем он сможет предоставить явные реализации.
Дополнительные сведения см. в разделе "Интерфейсы " и "Явная реализация интерфейса".
Ограничения универсального типа
При реализации универсальных методов интерфейса с ограничениями параметров типа возникают следующие ошибки:
- CS0425: ограничения для параметра типа метода должны соответствовать ограничениям для параметра типа метода интерфейса. Вместо этого рекомендуется использовать явную реализацию интерфейса.
- CS0460: ограничения для переопределения и явных методов реализации интерфейса наследуются от базового метода, поэтому они не могут быть указаны напрямую, за исключением класса или ограничения структуры.
Эти ошибки можно исправить с помощью следующих методов:
-
whereУбедитесь, что предложение в реализуемом методе идентично объявлению метода интерфейса или соответствует семантике ограничений (CS0425). Ограничения параметров типа в реализации должны совпадать с ограничениями, определенными в интерфейсе или базовом методе. - Удалите явные объявления ограничений из методов переопределения и явной реализации интерфейса (CS0460). Переопределённый метод автоматически наследует свои ограничения из базового или интерфейсного метода, поэтому их повторное объявление избыточно и не допускается, за исключением конкретных случаев, разрешённых в C# 8 и более поздних версиях.
-
defaultПримените ограничение для разрешения неоднозначности с типами ссылок, допускающим значение NULL, в переопределении и явных реализациях интерфейса при использовании C# 9 или более поздней версии (CS0460). Это исключение из правила наследования ограничений позволяет явно задать ограничение по умолчанию для разрешения неоднозначностей в контекстах аннотаций, допускающих значение null. - Явно указывайте ограничения
where T : classилиwhere T : structдля методов переопределения и явной реализации интерфейса при использовании C# 8 или позже, чтобы включить аннотации ссылочного типа, допускающие null (CS0460). Эти конкретные ограничения разрешены для поддержки анализа обнуляемых ссылочных типов на параметрах типа, ограниченных ссылочными или значимыми типами.
Дополнительные сведения см. в разделе "Ограничения" для параметров типа, интерфейсов и ссылочных типов, допускающих значение NULL.
Видимость и модификаторы методов
При реализации методов интерфейса с неправильными специальными возможностями или модификаторами возникают следующие ошибки:
- CS0736: Член не реализует экземплярный член интерфейса. Он не может реализовать член интерфейса, поскольку является статическим.
- CS0737: член не реализует интерфейсный член. Он не может реализовать интерфейсный член, так как он не является публичным.
Эти ошибки можно исправить с помощью следующих методов:
-
staticУдалите модификатор из объявления метода, реализующего член интерфейса (CS0736). До C# 10, члены интерфейса являются инстанциальными членами, а не статическими. -
publicДобавьте модификатор доступа в метод, реализующий член интерфейса (CS0737). Все члены интерфейса неявно являютсяpublic, поскольку интерфейсы определяют контракт для публичного поведения, поэтому метод реализации должен также иметь публичную доступность, чтобы быть доступным через ссылку на интерфейс.
Дополнительные сведения см. в разделе "Интерфейсы и модификаторы доступа".
Реализация аксессора и конфликты
При реализации свойств интерфейса или событий с методами доступа, имеющими проблемы видимости или конфликты именования, возникают следующие ошибки:
- CS0277: член не реализует член интерфейса, так как он не является общедоступным.
- CS0470: Метод не может реализовать акцессор интерфейса для типа. Используйте явную реализацию интерфейса.
- CS0686: Акцессор не может реализовать член интерфейса. Используйте явную реализацию интерфейса.
Эти ошибки можно исправить с помощью следующих методов:
- Удалите любые модификаторы доступа из аксессоров свойств, чья видимость менее, чем
public, или добавьте модификаторpublic, если он отсутствует (CS0277). Все члены интерфейса неявноpublic, поэтому метод доступа должен также иметь публичную доступность, чтобы соответствовать контракту интерфейса и быть доступным через тип интерфейса. - Замените методы именами, похожими на методы доступа (например
get_PropertyName), с использованием правильного синтаксиса свойств через явную реализацию интерфейса (CS0470). Компилятор создает методы доступа для свойств автоматически, а попытка вручную создать методы с этими зарезервированными именами конфликтует с механизмом реализации свойств. - Используйте явный синтаксис реализации интерфейса для разрешения конфликтов именования, если интерфейс содержит имена методов, совпадающие с автосгенерированными методами доступа (CS0686). Компилятор автоматически генерирует такие методы, как
get_Propertyиset_Propertyдля свойств, иadd_Eventиremove_Eventдля событий. Поэтому, если интерфейс объявляет методы с такими же именами, требуется явная реализация для устранения неоднозначности между методом интерфейса и методом доступа, созданным компилятором.
Дополнительные сведения см. в разделе "Интерфейсы", " Свойства" и "События".
Неоднозначные и конфликтующие реализации
Следующие ошибки возникают, когда компилятор не может определить, какую реализацию интерфейса следует использовать:
- CS0473: явная реализация интерфейса "имя метода" соответствует нескольким членам интерфейса. Какой элемент интерфейса на самом деле выбран, зависит от реализации. Вместо этого рекомендуется использовать неявную реализацию.
- CS8705: Член интерфейса "member" не имеет наиболее конкретной реализации. Ни одна из реализаций не является более конкретной.
Эти ошибки можно исправить с помощью следующих методов:
- Исключите явную реализацию интерфейса и вместо этого используйте одну неявную общедоступную реализацию для обоих методов интерфейса (CS0473). Когда обобщенный метод получает ту же сигнатуру, что и необобщенный метод (например, при реализации
ITest<int>, гдеTestMethod(int)иTestMethod(T)становятся идентичными), система метаданных инфраструктуры общего языка не может однозначно определить, какой член интерфейса связывается с каким слотом реализации, поэтому использование неявной реализации позволяет одному методу удовлетворять обоим требованиям интерфейса. - Предоставьте явную реализацию в классе или структуре реализации, которая разрешает неоднозначность между несколькими реализациями по умолчанию (CS8705). Эта ошибка обычно возникает с шаблонами наследования алмазов, в которых класс реализует несколько интерфейсов, каждый из которых предоставляет реализации по умолчанию для одного элемента. Компилятору необходимо явно указать, какую реализацию следует использовать или предоставить собственную реализацию.
- Реструктурирует иерархию интерфейса, чтобы избежать конфликтов наследования алмазов, в которых несколько интерфейсов предоставляют реализации по умолчанию для одного члена (CS8705). Изменив связи интерфейса или объединив реализации по умолчанию в единый интерфейс, можно устранить неоднозначность, которая препятствует компилятору определять наиболее конкретную реализацию.
Дополнительные сведения см. в разделе "Интерфейсы " и "Методы интерфейса по умолчанию".
Специальные ограничения реализации
Следующая ошибка возникает при использовании специальных типов параметров, несовместимых с реализацией интерфейса:
- CS0630: член не может реализовать член интерфейса, так как он имеет параметр __arglist.
Эту ошибку можно исправить с помощью следующих методов:
-
__arglistУдалите параметр из метода реализации (CS0630). Ключевое__arglistслово позволяет методам принимать переменные числа аргументов неуправляемым способом, но эта функция несовместима с реализацией интерфейса, так как контракты интерфейса требуют прогнозируемых, типобезопасных подписей, которые можно проверить во время компиляции. - Замените параметр параметром
__arglistмассива для списков аргументов переменнойparamsдлины (CS0630). В отличие от__arglist, ключевое словоparamsпредоставляет безопасный для типов механизм для принятия переменного количества аргументов, который полностью совместим с реализацией интерфейса и поддерживает безопасность типов на этапе компиляции, которая требуется интерфейсами.
Дополнительные сведения см. в разделе "Интерфейсы " и ключевое слово params.