Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Ошибки и предупреждения, связанные с типами
- CS8343:
ref structsне удается реализовать интерфейсы - CS8344:
foreachоператор не может работать с перечислителями в асинхронных или итераторных методах, так как тип являетсяref structили параметром типа, который позволяетref struct. - CS8345: свойство field или auto-implemented не может быть типом, если он не является членом экземпляра
ref struct. - CS9048:
scopedмодификатор можно использовать только для ссылок иref structзначений. - CS9050:
refполе не может ссылаться наref struct. - CS9059: поле ссылок можно объявить только в структуре ссылок.
- CS9241: "ref struct" уже указан.
- CS9242: предложение "разрешить" должно быть последним заданным ограничением.
- CS9243: не удается разрешить ссылочные структуры для параметра типа, известного из других ограничений, быть классом.
- CS9244: тип может не быть параметром
ref structтипа, позволяющим ссылочные структуры использовать его в качестве параметра в универсальном типе или методе. - CS9245: тип не может реализовать член интерфейса для
ref structтипа. - CS9246: к элементу интерфейса, отличному от виртуального экземпляра, не удается получить доступ к параметру типа, который разрешает ссылку.
- CS9247: оператор foreach не может работать с перечислителями типа, так как это параметр типа, позволяющий ref ref структуру и не известно во время компиляции.
IDisposable - CS9267: тип элемента итератора может не быть структурой ссылок или параметром типа, позволяющим ссылочные структуры
Нарушения безопасности ссылок
- CS8345: свойство field или auto-implemented не может быть типом, если он не является членом экземпляра
ref struct. - CS9048:
scopedмодификатор можно использовать только для ссылок иref structзначений. - CS9050:
refполе не может ссылаться наref struct. - CS9059:
refполе может быть объявлено только в объектеref struct.
Тип ref struct может включать ref поля. Другие типы не допускаются ref . Компилятор применяет ограничения на объявления и использование типов для применения ref struct правил безопасности ссылок на экземпляры любого ref struct типа:
- Только
ref structтипы могут содержать автоматически реализованныеrefсвойства. - Только
ref structтипы илиrefпеременные могут иметьscopedмодификатор. refПоле можно объявить только в типеref struct.refПоле не может ссылаться наref structтип/
Нарушение любого из этих правил приводит к одной из перечисленных ошибок. Если вы намерены использовать эту функцию языка, преобразуйте тип в тип ref struct. В противном случае удалите запрещенную конструкцию.
Реализация интерфейса структуры ref
- CS8343:
ref structsне удается реализовать интерфейсы - CS8344:
foreachоператор не может работать с перечислителями в асинхронных или итераторных методах, так как тип являетсяref structили параметром типа, который позволяетref struct. - CS9241: "ref struct" уже указан.
- CS9242: предложение "разрешить" должно быть последним заданным ограничением.
- CS9243: не удается разрешить ссылочные структуры для параметра типа, известного из других ограничений, быть классом.
- CS9244: тип может не быть параметром
ref structтипа, позволяющим ссылочные структуры использовать его в качестве параметра в универсальном типе или методе. - CS9245: тип не может реализовать член интерфейса для
ref structтипа. - CS9246: к элементу интерфейса, отличному от виртуального экземпляра, не удается получить доступ к параметру типа, который разрешает ссылку.
- CS9247: оператор foreach не может работать с перечислителями типа, так как это параметр типа, позволяющий ref ref структуру и не известно во время компиляции.
IDisposable - CS9267: тип элемента итератора может не быть структурой ссылок или параметром типа, позволяющим ссылочные структуры
До C# 13 ref struct типы не могут реализовать интерфейсы; компилятор создает CS8343. Начиная с C# 13, ref struct типы могут реализовывать интерфейсы в соответствии со следующими правилами:
- Невозможно
ref structпреобразовать его в экземпляр интерфейса, который он реализует. Это ограничение включает неявное преобразование при использованииref structтипа в качестве аргумента, если параметр является типом интерфейса. Преобразование приводит к преобразованию бокса, которое нарушает безопасность ссылок. - Объект
ref struct, реализующий интерфейс , должен реализовывать все члены интерфейса. Необходимоref structреализовать элементы, в которых интерфейс включает реализацию по умолчанию.
Начиная с C# 13, ref struct можно использовать в качестве аргумента типа для параметра универсального типа, если и только если параметр универсального типа имеет allows ref struct анти-ограничение. При использовании allows ref struct анти-ограничения необходимо соблюдать следующие правила:
- Аргумент
ref structтипа используется в качестве аргумента типа, параметр типа должен иметьallows ref structанти-ограничение.- Анти-ограничениеallows ref structдолжно быть последним вwhereпредложении для этого параметра. - Использование экземпляров, которые параметр типа должен соответствовать правилам безопасности ссылок.
- Аргумент
ref structтипа, который может быть типомref struct, нельзя использовать в качестве типа элемента для метода итератора.