Поделиться через


Ошибки и предупреждения, связанные с типами ref struct

  • 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 , нельзя использовать в качестве типа элемента для метода итератора.