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


Ошибки и предупреждения, связанные с генераторами источников и перехватчиками

При загрузке исходных генераторов или перехватчиков во время компиляции возникают следующие ошибки:

  • CS9137: экспериментальная функция перехватчиков не включена. Добавьте <Features>InterceptorsPreview</Features> в проект.
  • CS9138: метод нельзя использовать в качестве перехватчика, так как он или его содержащий тип имеют параметры типа.
  • CS9139: Невозможно перехватить: компиляция не содержит файл с указанным путем.
  • CS9140: невозможно перехватить: компиляция не содержит файла с указанным путем. Вы имели в виду использовать другой путь?
  • CS9141: указанный номер строки и символа не ссылается на имя перехватываемого метода, а на маркер.
  • CS9142: указанный файл имеет n строки, которые меньше указанного номера mстроки.
  • CS9143: указанная строка имеет c длину символов, что меньше указанного номера nсимволов.
  • CS9144: не удается перехватывать метод M с перехватчиком V , так как подписи не соответствуют.
  • CS9145: не удается перехватить: путь не сопоставлен. Ожидается сопоставленный путь.
  • CS9146: метод перехватчика должен быть обычным методом-членом.
  • CS9147: Указанный номер строки и символа не ссылается на начало токена. Вы хотели использовать строку n и номер символа c?
  • CS9148: перехватчик должен иметь this параметр сопоставления параметров.
  • CS9149: перехватчик не должен иметь this параметр, так как метод не имеет this параметра.
  • CS9150: перехватчик не может иметь путь к файлу null .
  • CS9151: возможное имя метода M не может быть перехвачено, поскольку оно не вызывается.
  • CS9152: не удается перехватить вызов в файле с этим путем, так как несколько файлов в компиляции имеют этот путь.
  • CS9153: указанный вызов перехватывается несколько раз.
  • CS9155: невозможно перехватить вызов с M из-за того, что он недоступен в V.
  • CS9156: Не удается перехватить вызов M с помощью V из-за различий в модификаторах 'scoped' или атрибутах [UnscopedRef].
  • CS9157: номера строк и символов, предоставляемые InterceptsLocationAttribute , должны быть положительными.
  • CS9160: оператор nameof не может быть перехвачен.
  • CS9161: перехватчик не может быть помечен с помощью UnmanagedCallersOnlyAttribute.
  • CS9177: перехватчик должен быть не универсальным или иметь соответствующую арность.
  • CS9178: метод должен быть не универсальным для сопоставления
  • CS9206: перехватчик не может быть объявлен в глобальном пространстве имен.
  • CS9207: не удается перехватывать, так как метод не является вызовом обычного метода-члена.
  • CS9231: аргумент данных для InterceptsLocationAttribute не имеет правильного формата.
  • CS9232: Версия 'version' формата интерцепторов не поддерживается. Последняя поддерживаемая версия — '1'.
  • CS9233: не удается перехватить вызов в файле "file", так как он дублируется в другом месте компиляции.
  • CS9234: не удается перехватить вызов в файле "file", так как соответствующий файл не найден в компиляции.
  • CS9235: аргумент данных для InterceptsLocationAttribute ссылается на недопустимое положение в файле "file".

Следующие предупреждения создаются при загрузке генераторов источников или перехватчиков во время компиляции:

  • CS8784: генератор 'YourSourceGeneratorName' не удалось инициализировать. Это не приведет к возникновению ошибок вывода и компиляции.
  • CS8785: генератор "YourSourceGeneratorName" не удалось создать источник. Это не приведет к возникновению ошибок вывода и компиляции.
  • CS9057: сборка анализатора не может использоваться, так как она ссылается на более новую версию компилятора, чем текущая версия.
  • CS9067: ссылка на анализатор, указанная несколько раз.
  • CS9154: перехват вызова на M с перехватчиком V, но сигнатуры не соответствуют.
  • CS9158: значение NULL ссылочных типов в возвращаемом типе не соответствует перехватываемому методу.
  • CS9159: Нулевость ссылочных типов у параметра не соответствует перехватываемому методу.
  • CS9270: 'InterceptsLocationAttribute(string, int, int)' не поддерживается. Перейдите на генерацию этих атрибутов, ориентированной на "InterceptableLocation". (https://github.com/dotnet/roslyn/issues/72133)

Эти ошибки и предупреждения соответствуют следующим темам:

Перехватчики являются экспериментальными

  • CS9137: экспериментальная функция перехватчиков не включена. Добавьте <Features>InterceptorsPreview</Features> в проект.

Чтобы использовать перехватчики, добавьте элемент <Features>InterceptorsPreview</Features> в файл проекта в разделе <PropertyGroup> (CS9137), так как перехватчики являются экспериментальной функцией, которая по умолчанию не включена. Это явное согласие требуется, так как функция перехватчиков подвержена критическим изменениям или удалению в будущих выпусках, и компилятору требуется подтверждение того, что вы понимаете риски, прежде чем разрешить его использование. Дополнительные сведения о перехватчиках и их возможностях см. в документации по функциям C# 12.

Несоответствие подписи

Следующие ошибки и предупреждения указывают на несоответствие между методом перехватчика и перехватываемым методом.

  • CS9144: не удается перехватывать метод M с перехватчиком V , так как подписи не соответствуют.
  • CS9148: перехватчик должен иметь this параметр сопоставления параметров.
  • CS9149: перехватчик не должен иметь this параметр, так как метод не имеет this параметра.
  • CS9155: невозможно перехватить вызов M, так как он недоступен в пределах V.
  • CS9156: Невозможно перехватить вызов M с помощью V из-за различий в модификаторах 'scoped' или атрибутах [UnscopedRef].
  • CS9177]: перехватчик должен быть не универсальным или иметь соответствующий arity.
  • CS9178: метод должен быть не универсальным для сопоставления

Кроме того, следующие предупреждения указывают на несоответствие в сигнатурах перехватчика и перехватываемого метода.

  • CS9154: перехват вызова к M с использованием перехватчика V, но сигнатуры не совпадают.
  • CS9158: значение NULL ссылочных типов в возвращаемом типе не соответствует перехватываемому методу.
  • CS9159: значение NULL ссылочных типов в типе параметра не соответствует перехватываемому методу.
  • CS9270: 'InterceptsLocationAttribute(string, int, int)' не поддерживается. Вместо этого используйте генерацию этих атрибутов на основе 'InterceptableLocation'. (https://github.com/dotnet/roslyn/issues/72133)

Чтобы устранить эти проблемы, убедитесь, что метод перехватчика соответствует подписи и требованиям доступа перехватываемого метода.

  • Убедитесь, что подпись метода перехватчика точно соответствует перехватываемому методу (CS9144, CS9154). Типы параметров, модификаторы, порядок и возвращаемый тип должны совпадать. Просмотрите объявления обоих методов и согласуйте их подписи.
  • this Добавьте параметр в перехватчик, если перехватываемый метод является методом экземпляра (CS9148) или удалите this параметр, если перехватываемый метод является статическим (CS9149). Перехватчики экземпляров требуют this параметра декларативного типа, в то время как статические перехватчики не должны иметь одного.
  • Объявите перехватчик в месте, где доступен перехватываемый метод (CS9155). Если перехватываемый метод имеет internalзначение, перехватчик должен находиться в той же сборке. Если это private, интерцептор должен быть в том же типе или вложенном типе.
  • Подберите scoped модификаторы и [UnscopedRef] атрибуты на соответствующих ref параметрах (CS9156). Каждый ref параметр в перехватчике должен иметь те же заметки времени существования, что и соответствующий параметр в методе перехвата, чтобы обеспечить безопасность памяти.
  • Убедитесь, что оба метода соответствуют универсальному arity (CS9177, CS9178). Если перехватываемый метод не является универсальным, перехватчик также должен быть не универсальным. Если перехватываемый метод имеет параметры типа, перехватчик должен иметь то же количество параметров типа с совместимыми ограничениями.
  • Сопоставьте аннотации nullability в возвращаемом типе (CS9158) и типах параметров (CS9159). Включите в проекте ссылочные типы, допускающие значение NULL, и убедитесь, что заметки о значении NULL перехватчика соответствуют перехватываемому методу точно для обеспечения безопасности типов.
  • Используйте обновлённую генерацию на основе InterceptableLocation для InterceptsLocationAttribute вместо устаревшего конструктора (string, int, int) (CS9270). Новый формат обеспечивает лучшую поддержку инструментов и проверку во время компиляции. См. выпуск на GitHub для получения рекомендаций по миграции.

Неправильное сопоставление

Перехватчики требуют сопоставления источников, которое сопоставляет перехватываемый метод и метод перехватчика. Следующие ошибки указывают на проблему с сопоставлением:

  • CS9139: не удается перехват: компиляция не содержит файл по указанному пути.
  • CS9140: Перехват невозможен: компиляция не содержит файл с указанным путем. Вы имели в виду использовать другой путь?
  • CS9141: указанный номер строки и символа ссылается не на имя перехватываемого метода, а на маркер.
  • CS9142: указанный файл имеет n строки, которые меньше указанного номера mстроки.
  • CS9143: указанная строка имеет c длину символов, что меньше указанного номера nсимволов.
  • CS9145: Не удается перехватить: Путь не сопоставлен. Ожидается сопоставленный путь.
  • CS9147: Указанный номер строки и позиции не ссылается на начало токена. Вы имели в виду использовать строку n и позицию c?
  • CS9150: Перехватчик не может иметь путь к файлуnull.
  • CS9157: номера строк и символов, предоставляемые InterceptsLocationAttribute , должны быть положительными.

Чтобы исправить ошибки сопоставления, убедитесь, что в InterceptsLocationAttribute присутствуют допустимые пути к файлам и точные сведения о позиции.

  • Проверьте, чтобы путь к файлу точно соответствовал файлу в вашей компиляции (CS9139, CS9140). Используйте точный путь, как он отображается в проекте, с учетом правильного регистра и разделителей каталога. Если компилятор предлагает альтернативный путь, обновите атрибут, чтобы использовать этот путь.
  • Используйте сопоставленные пути к файлам при работе с генераторами исходного кода, преобразующими пути к файлам (CS9145). Генераторы исходного кода часто переназначают пути для созданных файлов, и необходимо использовать сопоставленный путь, который распознаётся компилятором, а не исходный путь.
  • Убедитесь, что путь к файлу не является null в вашем InterceptsLocationAttribute (CS9150). Каждый перехват должен указать допустимый путь к файлу, отличному от NULL, который определяет исходный файл, содержащий вызов для перехвата.
  • Укажите положительную, основанную на 1 нумерацию строк и символов (CS9157). Номера строк и позиции символов должны начинаться с 1, а не 0. Убедитесь, что генератор источников использует индексирование на основе 1 при вычислении позиций.
  • Укажите точное начало маркера имени метода (CS9141, CS9147). Номера строк и символов должны определять первый символ имени метода в вызове, а не пробелы, операторы или другие маркеры. Если компилятор предлагает альтернативные координаты, используйте их для определения правильного начала токена.
  • Оставайтесь в пределах файла (CS9142, CS9143). Убедитесь, что номер строки не превышает общее число строк, а номер символа не превышает длину строки. Пересчитывайте позиции, если исходный файл изменился с момента создания атрибута.

Неправильное объявление перехватчика

Следующие ошибки указывают на проблемы с объявлениями перехватчика, включая проблемы с форматом InterceptsLocationAttribute или нарушениями правил перехватчика:

  • CS9138: метод нельзя использовать в качестве интерсептора, так как он или его содержащий тип имеют параметры типа.
  • CS9146: метод перехватчика должен быть обычным методом-членом.
  • CS9151: невозможно перехватить возможное имя M метода, так как оно не вызывается.
  • CS9152: не удается перехватить вызов в файле с этим путем, так как несколько файлов в компиляции имеют этот путь.
  • CS9153: указанный вызов перехватывается несколько раз.
  • CS9160: оператор nameof не может быть перехвачен.
  • CS9161: перехватчик не может быть помечен с помощью UnmanagedCallersOnlyAttribute.
  • CS9206: перехватчик не может быть объявлен в глобальном пространстве имен.
  • CS9207: не удается перехватывать, так как метод не является вызовом обычного метода-члена.
  • CS9231: аргумент данных для InterceptsLocationAttribute не имеет правильного формата.
  • CS9232: Версия 'version' формата интерцепторов не поддерживается. Последняя поддерживаемая версия - '1'.
  • CS9233: не удается перехватить вызов в файле "file", так как он дублируется в другом месте компиляции.
  • CS9234: не удается перехватить вызов в файле "file", так как соответствующий файл не найден в компиляции.
  • CS9235: аргумент данных для InterceptsLocationAttribute ссылается на недопустимое положение в файле "file".

Чтобы исправить ошибки объявления перехватчика, следуйте правилам для допустимых объявлений перехватчика и использования InterceptsLocationAttribute.

  • Правильно отформатируйте InterceptsLocationAttribute аргумент данных (CS9231). Атрибут требует специально структурированных данных, которые кодируют путь к файлу и сведения о расположении. Убедитесь, что генератор источников создает данные в ожидаемом формате, соответствующем текущей спецификации перехватчиков.
  • Используйте версию 1 в вашей InterceptsLocationAttributeверсии (CS9232), так как она является последней поддерживаемой версией. Обновите генератор исходного кода, чтобы выводить атрибуты формата версии 1 вместо неподдерживаемых версий.
  • Убедитесь в уникальности путей к файлам в компиляции (CS9233, CS9234). Если компиляция содержит повторяющиеся пути к файлам, переименуйте или переорганизуйте файлы, чтобы сделать каждый путь уникальным. Убедитесь, что путь к файлу в атрибуте соответствует файлу, который фактически включен в компиляцию.
  • Проверьте позицию точек данных в допустимых расположениях кода (CS9235). Номера строк и символов должны ссылаться на допустимую точку перехвата в указанном файле. Повторно создайте атрибут, если исходный файл изменился или если позиция выходит за пределы файла.
  • Объявите методы перехватчика, не являющиеся универсальными, в неуниверсальных типах (CS9138). Перехватчики не могут иметь параметры типа в самом методе или в типе, который их содержит. Если необходимо перехватить универсальный метод, создайте не универсальный перехватчик, который работает с определенным созданным типом.
  • Сделайте перехватчики обычными методами-членами (CS9146). Перехватчики не могут быть операторами, конструкторами, финализаторами, свойствами или индексаторами. Объявите перехватчик как обычный статический или экземплярный метод.
  • Перехват вызовов фактических методов, а не выражений (CS9151, CS9207). Перехватывать можно только вызовы обычных методов-членов, которые выполняются. Невозможно перехватывать группы методов, делегаты или методы, на которые ссылаются без вызова. Убедитесь, что перехватываемое местоположение идентифицирует фактический вызов метода.
  • Удалите повторяющиеся попытки перехвата (CS9153). Каждый вызов метода можно перехватывать только один раз. Если несколько InterceptsLocationAttribute экземпляров предназначены для одного вызова, удалите все, кроме одного, чтобы устранить неопределённость.
  • Не перехватывать nameof операторы (CS9160). Оператор nameof не вызывает методы во время выполнения, поэтому его невозможно перехватить. Перехватывать только фактические вызовы методов, исполняемых во время выполнения.
  • Удалите UnmanagedCallersOnlyAttribute из перехватчиков (CS9161). Перехватчики должны быть вызываемыми из управляемого кода и не могут быть помечены как UnmanagedCallersOnlyAttribute. Удалите атрибут из объявления метода перехватчика.
  • Объявите перехватчики в пространстве имен (CS9206). Перехватчики не могут быть объявлены в глобальном пространстве имен и должны содержаться по крайней мере в одном объявлении пространства имен. Поместите класс перехватчика внутри пространства имен.
  • Разрешать повторяющиеся пути к файлам на уровне компиляции (CS9152). Если несколько файлов используют один и тот же путь в компиляции, компилятор не может определить, какой файл следует перехватывать. Убедитесь, что конфигурация сборки создает уникальные пути к файлам или использует другую стратегию организации для исходных файлов.

Совместимость анализатора

Следующие предупреждения указывают на проблемы с сборками анализатора или генератора источников:

  • CS9057: сборка анализатора не может использоваться, так как она ссылается на более новую версию компилятора, чем текущая версия.
  • CS9067: ссылка на анализатор, указанная несколько раз.

Эти предупреждения возникают при возникновении проблем совместимости со сборками анализаторов:

  • CS9057 создается, когда сборка анализатора ссылается на версию компилятора Roslyn, которая является более новой, чем запущенная в данный момент. Это предотвращает загрузку анализатора, так как он может зависеть от API или поведения, недоступных в текущей версии компилятора. Чтобы устранить эту проблему, обновите компилятор или пакет SDK до соответствия требованиям анализатора или используйте версию анализатора, совместимую с текущей версией компилятора.
  • CS9067 предупреждает, когда один и тот же модуль анализатора упоминается несколько раз в вашем проекте. Обычно это происходит, когда анализатор включается через несколько путей или ссылок на пакеты. Хотя и не ошибка, повторяющиеся ссылки могут повлиять на производительность сборки и могут вызвать непредвиденное поведение. Удалите повторяющиеся ссылки, чтобы устранить это предупреждение.