Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Компилятор создает следующие ошибки для недопустимых объявлений статических абстрактных или виртуальных элементов в интерфейсах:
- CS8920: интерфейс не может использоваться в качестве аргумента типа. Статический член не имеет наиболее конкретной реализации в интерфейсе.
- CS8921: параметр унарного оператора должен быть содержащим типом или параметром типа, ограниченным для него.
-
CS8922: тип параметра для
++или--оператора должен быть содержащим типом или его параметром типа, ограниченным для него. -
CS8923: Тип возвращаемого значения для оператора
++или--должен совпадать с типом параметра или быть производным от типа параметра, или быть параметром типа содержащего типа, если только тип параметра не является другим параметром типа. - CS8924: один из параметров двоичного оператора должен быть содержащим типом или параметром типа, ограниченным для него.
- CS8925: Первый операнд перегруженного оператора сдвига должен иметь тот же тип, что и тип, который его содержит, или должен быть ограничен его параметром типа.
- CS8926: статический виртуальный или абстрактный элемент интерфейса можно получить только в параметре типа.
- CS8928: тип не реализует статический член интерфейса. Метод не может реализовать член интерфейса, так как он не является статическим.
- CS8930: явная реализация определяемого пользователем оператора должна быть объявлена статической
- CS8931: определяемое пользователем преобразование в интерфейсе должно преобразовываться в параметр типа или из параметра типа в заключающем типе, ограниченном для заключающего типа.
- CS8932: Метод 'UnmanagedCallersOnly' не может реализовать член интерфейса в типе
- CS9044: тип не реализует член интерфейса. Метод неявно не может реализовать недоступный член.
- CS9046: один из параметров оператора равенства или неравенства, объявленного в интерфейсе, должен быть параметром типа, ограниченным интерфейсом.
Эти ошибки возникают в трех местах в коде:
- При объявлении интерфейса со статическими абстрактными или виртуальными элементами
- При объявлении типа, реализующего интерфейс со статическими абстрактными или виртуальными элементами, и
- При доступе к статическому абстрактному или виртуальному методу, объявленному в интерфейсе.
Ошибки в объявлении интерфейса
При попытке объявить интерфейс с элементами static abstract или static virtual вы можете столкнуться со следующими ошибками:
- CS8921: параметр унарного оператора должен быть содержащим типом или параметром типа, ограниченным для него.
-
CS8922: тип параметра для
++или--оператора должен быть содержащим типом или его параметром типа, ограниченным для него. -
CS8923: Возвращаемый тип для оператора
++или--должен либо совпадать с типом параметра, либо быть производным от типа параметра, либо быть параметром типа, ограниченным содержащим типом, если только тип параметра не является другим параметром типа. - CS8924: один из параметров двоичного оператора должен быть содержащим типом или параметром типа, ограниченным для него.
- CS8925: Первый операнд перегруженного оператора сдвига должен иметь тот же тип, что и содержащий тип, или его типовой параметр, к нему ограниченный
- CS8931: определяемое пользователем преобразование в интерфейсе должно преобразовываться в параметр типа или из параметра типа в заключающем типе, ограниченном для заключающего типа.
- CS9046: один из параметров оператора равенства или неравенства, объявленного в интерфейсе, должен быть параметром типа, ограниченным интерфейсом.
Для унарных операторов, объявленных в интерфейсе, убедитесь, что параметр является либо типом самого интерфейса, либо параметром T, где T ограничен на реализацию интерфейса (CS8921). Это ограничение гарантирует, что оператор может применяться только к типам, реализующим интерфейс, позволяя компилятору выбирать правильную реализацию во время компиляции.
Для операторов инкремента (++) и декремента (--) убедитесь, что параметр соответствует тем же правилам, что и другие унарные операторы (CS8922). Кроме того, возвращаемый тип должен совпадать с типом параметра, производным от него или параметром типа интерфейса, ограниченным интерфейсом (CS8923). Эти правила гарантируют, что операции добавочного и декремента возвращают совместимый тип, который можно назначить исходной переменной.
Для двоичных операторов хотя бы один из двух параметров должен быть содержащим тип интерфейса или параметр типа, ограниченный для реализации интерфейса (CS8924). Это требование позволяет другому параметру быть любым типом, что позволяет операторам, таким как T operator +(T left, int right) в универсальных математических сценариях.
Для операторов shift (<< и >>), первый операнд должен быть содержащим типом или параметром ограниченного типа (CS8925). Второй операнд следует стандартным правилам оператора сдвига и обычно равен int.
Для определяемых пользователем операторов преобразования преобразование должно включать параметр типа, ограниченный типом заключенного интерфейса (CS8931). Невозможно определить преобразования между произвольными типами в интерфейсе; Преобразование должно относиться к типам, реализующим интерфейс.
Для операторов равенства (==) и неравенства (!=) по крайней мере один параметр должен быть параметром типа, ограниченным интерфейсом, а не только типом интерфейса (CS9046). Это более строгое требование для операторов равенства обеспечивает корректную безопасность типов при сравнении экземпляров посредством интерфейса.
Дополнительные сведения о правилах объявлений операторов в интерфейсах см. в разделе статических абстрактных элементов в интерфейсах. Практическое руководство по реализации этих шаблонов см. в статье "Изучение статических абстрактных элементов интерфейса".
Ошибки в типе, реализующие объявление интерфейса
При определении типа, реализующего интерфейс с методами static abstract или static virtual, вы можете столкнуться со следующими ошибками:
- CS8928: тип не реализует статический член интерфейса. Метод не может реализовать член интерфейса, так как он не является статическим.
- CS8930: явная реализация определяемого пользователем оператора должна быть объявлена статической
- CS8932: метод 'UnmanagedCallersOnly' не может реализовать член интерфейса в указанном типе
- CS9044: тип не реализует член интерфейса. Метод неявно не может реализовать недоступный член.
При реализации статического абстрактного или статического элемента виртуального интерфейса объявите метод реализации с помощью static модификатора (CS8928). В отличие от элементов интерфейса экземпляра, реализованных методами экземпляра, статические абстрактные члены требуют статических реализаций, так как среда выполнения вызывает их в самом типе, а не в экземпляре.
Для явных реализаций определяемых пользователем операторов из интерфейса включите static модификатор в реализацию (CS8930). Явные реализации интерфейса операторов соответствуют тому же статическому требованию, что и неявные реализации.
System.Runtime.InteropServices.UnmanagedCallersOnlyAttribute Удалите атрибут из любого метода, реализующего член интерфейса (CS8932). Методы, помеченные с помощью этого атрибута, могут вызываться только из неуправляемого кода и не могут участвовать в реализации интерфейса, так как среда выполнения должна вызывать их через механизм диспетчеризации интерфейса.
Если метод реализации имеет более строгие уровни доступа, чем член интерфейса (например, метод private или internal, реализующий член интерфейса public), используйте явный синтаксис реализации интерфейса вместо неявной реализации (CS9044). Неявная реализация требует, чтобы реализующий элемент был как минимум столь же доступен, как и член интерфейса, который он реализует.
Дополнительные сведения о реализации элементов интерфейса см. в разделе Интерфейсы и явная реализация интерфейса.
Ошибки при вызове статических абстрактных членов интерфейса
При попытке вызвать член, определенный как static abstract член или static virtual член интерфейса, могут возникнуть следующие ошибки:
- CS8920: интерфейс не может использоваться в качестве аргумента типа. Статический член не имеет наиболее конкретной реализации в интерфейсе.
- CS8926: статический виртуальный или абстрактный элемент интерфейса можно получить только в параметре типа.
При использовании интерфейса со статическими абстрактными элементами в качестве аргумента типа убедитесь, что все статические абстрактные члены имеют наиболее конкретную реализацию (CS8920). Эта ошибка возникает, когда компилятор не может определить, какую реализацию следует использовать, как правило, так как несколько иерархий интерфейса предоставляют конфликтующие реализации по умолчанию или нет реализации.
Доступ к статическим абстрактным или статическим элементам виртуального интерфейса через параметр типа, ограниченный для реализации интерфейса, а не через тип интерфейса напрямую (CS8926). Например, используйте T.MemberName , где T ограничено where T : IMyInterface, а не IMyInterface.MemberName. Компилятору требуется конкретный тип, чтобы разрешить вызов реализации, а параметр ограниченного типа предоставляет конкретный тип во время компиляции с помощью универсальной специализации.
Дополнительные сведения о доступе к статическим абстрактным элементам см. в разделе статических абстрактных элементов в интерфейсах.