Устраните ошибки и предупреждения в объявлениях членов расширения

В этой статье рассматриваются следующие ошибки компилятора:

  • CS1100: метод имеет модификатор параметров "this", который не относится к первому параметру
  • CS1101: модификатор параметров 'ref' нельзя использовать с 'this'.
  • CS1102: модификатор параметров 'out' нельзя использовать с 'this'.
  • CS1103: первый параметр метода расширения не может быть типом указателя.
  • CS1105: методы расширения должны быть статическими.
  • CS1106: методы расширения должны быть определены в не универсальном статическом классе.
  • CS1109: методы расширения должны быть определены на статических классах верхнего уровня, "name" является вложенным классом.
  • CS1110: не удается определить новое расширение, так как не удается найти требуемый тип ExtensionAttribute компилятора. Отсутствует ли ссылка на System.Core.dll?
  • CS1112: не используйте "ExtensionAttribute". Используйте ключевое слово 'this' вместо него.
  • CS1113: метод расширения, определенный для типа значения, нельзя использовать для создания делегатов.
  • CS1743: не удается указать значение по умолчанию для параметра "этот".
  • CS9281: объявления расширений могут не иметь имени.
  • CS9282: объявления расширения могут включать только методы или свойства.
  • CS9283: расширения должны быть объявлены в верхнем уровне, не универсальном, статичном классе.
  • CS9284: параметр приемника расширения не может иметь значение по умолчанию.
  • CS9285: контейнер расширения может иметь только один параметр приемника.
  • CS9287: параметр приемника не может иметь то же имя, что и параметр типа контейнера расширения.
  • CS9288: параметр, локальная переменная или локальная функция не могут иметь то же имя, что и параметр типа контейнера расширения.
  • CS9289: параметр типа члена имеет то же имя, что и параметр типа контейнера расширения.
  • CS9290: параметр, локальная переменная или локальная функция не могут иметь то же имя, что и параметр расширения.
  • CS9291: 'value': имя параметра, созданное автоматически, конфликтует с именем параметра расширения.
  • CS9292: параметр типа имеет то же имя, что и параметр расширения.
  • CS9293: не удается использовать параметр расширения в этом контексте.
  • CS9294: 'value': имя автоматически созданного параметра конфликтует с именем параметра типа расширения.
  • CS9295: расширенный тип должен ссылаться на все параметры типа, объявленные расширением, но параметр типа не ссылается.
  • CS9300: параметр приемника "ref" блока расширения должен быть типом значения или универсальным типом, ограниченным структурой.
  • CS9301: параметр приемника "" илиin "ref readonly" расширения должен быть конкретным (не универсальным) типом значения.
  • CS9302: объявлен новый защищенный член в блоке расширения.
  • CS9303: Нельзя объявлять экземплярные члены в блоке расширения с неименованным параметром получателя.
  • CS9304: Невозможно объявить асессоры только для инициализации в блоке расширения.
  • CS9305: не удается использовать модификаторы в параметре неназванного приемника блока расширения.
  • CS9306: Типы и псевдонимы не могут называться "extension".
  • CS9309: Синтаксис метода расширения запрещен в вложенной позиции внутри синтаксиса метода расширения.
  • CS9316: Члены расширения не разрешены в качестве аргумента для "nameof".
  • CS9317: параметр унарного оператора должен быть расширенным типом.
  • CS9318: тип параметра для ++ или -- должен быть расширенным типом.
  • CS9319: один из параметров двоичного оператора должен быть расширенным типом.
  • CS9320: Первый операнд перегруженного оператора сдвига должен иметь тот же тип, что и расширенный тип.
  • CS9321: блок расширения, расширяющий статический класс, не может содержать определяемые пользователем операторы.
  • CS9322: Нельзя объявить оператор экземпляра для структуры, если параметр приемника блока расширения не является параметром типа 'ref'.
  • CS9323: не удается объявить оператор расширения экземпляра для типа, который не известен как структуру и не известен как класс.
  • CS9326: 'name': имена членов расширения не могут совпадать с их расширенным типом.
  • CS9329: этот блок расширения сталкивается с другим блоком расширения. Они приводят к конфликтующим именам типов на основе контента в метаданных.
  • CS9339: разрешение расширения неоднозначно между следующими элементами.

Распространенные ошибки в объявлениях расширения

  • CS1102: модификатор параметров 'out' нельзя использовать с 'this'.
  • CS1103: первый параметр метода расширения не может быть типом указателя.
  • CS1106: методы расширения должны быть определены в не универсальном статическом классе.
  • CS1109: методы расширения должны быть определены на статических классах верхнего уровня, "name" является вложенным классом.
  • CS1113: метод расширения, определенный для типа значения, нельзя использовать для создания делегатов.
  • CS1743: не удается указать значение по умолчанию для параметра "этот".
  • CS9283: расширения должны быть объявлены в верхнем уровне, не универсальном, статичном классе.
  • CS9284: параметр приемника расширения не может иметь значение по умолчанию.
  • CS9285: контейнер расширения может иметь только один параметр приемника.

Компилятор выдает эти ошибки при нарушении правил, которые применяются ко всем объявлениям членов расширения независимо от выбранного синтаксиса. Дополнительные сведения см. в разделе "Методы расширения".

Чтобы правильно объявить члены расширения, соблюдайте следующие требования:

  • Объявите содержащий тип как не универсальный static класс или структуру (CS1106, CS9283).
  • Объявите содержащий тип на верхнем уровне, а не вложенный в другой тип (CS1109, CS9283).
  • Не преобразуйте методы расширения для типов значений в делегаты (CS1113). Вместо этого создайте обычный метод.
  • Не используйте out модификатор параметров для параметра приемника (CS1102).
  • Не предоставляйте значения по умолчанию для параметра приемника (CS1743, CS9284).
  • Не расширяйте типы указателей (CS1103). Параметр, this к который применяется модификатор, не может быть типом указателя.
  • Объявляйте только один параметр приемника для каждого контейнера расширения (CS9285).
  • CS9281: объявления расширений могут не иметь имени.
  • CS9282: объявления расширения могут включать только методы или свойства.
  • CS9287: параметр приемника не может иметь то же имя, что и параметр типа контейнера расширения.
  • CS9288: параметр, локальная переменная или локальная функция не могут иметь то же имя, что и параметр типа контейнера расширения.
  • CS9289: параметр типа члена имеет то же имя, что и параметр типа контейнера расширения.
  • CS9290: параметр, локальная переменная или локальная функция не могут иметь то же имя, что и параметр расширения.
  • CS9291: 'value': имя параметра, созданное автоматически, конфликтует с именем параметра расширения.
  • CS9292: параметр типа имеет то же имя, что и параметр расширения.
  • CS9293: не удается использовать параметр расширения в этом контексте.
  • CS9294: 'value': имя автоматически созданного параметра конфликтует с именем параметра типа расширения.
  • CS9295: расширенный тип должен ссылаться на все параметры типа, объявленные расширением, но параметр типа не ссылается.
  • CS9300: параметр приемника "ref" блока расширения должен быть типом значения или универсальным типом, ограниченным структурой.
  • CS9301: Параметр приемника 'in' или 'ref readonly' расширения должен быть конкретным (не универсальным) типом значения.
  • CS9302: новый защищенный элемент, указанный в блоке расширения.
  • CS9303: невозможно объявить члены экземпляра в блоке расширения с параметром неименованного приемника.
  • CS9304: не удается объявить методы доступа только для инициализации в блоке расширения.
  • CS9305: не удается использовать модификаторы в параметре неназванного приемника блока расширения.
  • CS9306: Типы и псевдонимы не могут называться "extension".
  • CS9309: синтаксис члена расширения запрещен во вложенной позиции в синтаксисе члена расширения.
  • CS9316: члены расширения не допускаются в качестве аргумента "nameof".
  • CS9317: параметр унарного оператора должен быть расширенным типом.
  • CS9318: тип параметра оператора ++ или -- должен быть расширенным типом.
  • CS9319: один из параметров двоичного оператора должен быть расширенным типом.
  • CS9320: Первый операнд перегруженного оператора сдвига должен иметь тот же тип, что и расширенный тип.
  • CS9321: блок расширения, расширяющий статический класс, не может содержать определяемые пользователем операторы.
  • CS9322: не удается объявить оператор экземпляра для структуры, если принимающий параметр блока расширения не является параметром 'ref'.
  • CS9323: не удается объявить оператор расширения экземпляра для типа, который не известен как структуру и не известен как класс.
  • CS9326: 'name': имена членов расширения не могут совпадать с их расширенным типом.
  • CS9329: этот блок расширения сталкивается с другим блоком расширения. Они приводят к конфликтующим именам типов на основе контента в метаданных.
  • CS9339: разрешение расширения неоднозначно между следующими элементами.

Эти ошибки относятся к блокам расширения, компоненту C# 14. Блоки расширения объявляются с помощью extension контекстного ключевого слова в статичном классе. Дополнительные сведения см. в разделе "Методы расширения".

Чтобы правильно объявить блоки расширения, соблюдайте следующие требования:

  • Не включайте токен имени в объявление расширения (CS9281). Расширение объявляет только приемник.
  • Не предоставляйте значения по умолчанию для параметра приемника (CS9284, описанные в распространенных ошибках).
  • Не используйте ключевое extension слово для типов или псевдонимов (CS9306). Это контекстное ключевое слово только для блоков расширения.

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

  • Включите только методы или свойства в качестве членов расширения (CS9282). Другие типы членов не поддерживаются.
  • Укажите имя параметра для получателя, содержащего члены расширения экземпляра (CS9303).
  • Убедитесь, что имя параметра приемника уникально в блоке расширения и не конфликтует с параметрами типа (CS9287, CS9288, CS9289, CS9290, CS9291, CS9292, CS9294).
  • Ссылка на все параметры типа, объявленные в расширении в расширенном типе (CS9295). Дополнительные параметры типа можно добавить для отдельных членов.
  • Не вкладывайте блоки расширения в другие блоки расширения (CS9309).
  • ref Используйте модификатор для параметра приемника только с типами значений или универсальными типами, ограниченными структурой (CS9300).
  • Используйте модификатор in или ref readonly на параметре приемника только с конкретными (не универсальными) типами значений (CS9301).
  • Не используйте модификаторы для неименованных параметров приемника (CS9305).
  • Не объявляйте protected члены в блоках расширений (CS9302). Члены расширения должны быть доступны в той области, где оно действует.
  • Не объявляйте initтолько методы доступа в блоках расширений (CS9304). Вместо этого используйте обычные методы задания свойств.
  • Не используйте члены расширения в качестве аргументов для nameof оператора (CS9316).
  • Выберите имена членов, отличающиеся от имени расширенного типа (CS9326).
  • Убедитесь, что блоки расширений имеют уникальные имена типов на основе контента в метаданных (CS9329). Консолидируйте или различайте блоки расширений, чтобы избежать конфликтов.
  • Разрешать неоднозначные вызовы члена расширения, предоставляя более конкретные сведения о типе или используя полные имена (CS9339).

Требования к оператору блока расширения

Блоки расширений поддерживают определяемые пользователем операторы с определенными требованиями:

  • Унарные операторы должны иметь расширенный тип в качестве параметра (CS9317).
  • Операторы инкремента (++) и декремента (--) должны иметь расширенный тип как параметр (CS9318).
  • Двоичные операторы должны иметь по крайней мере один параметр, который является расширенным типом (CS9319).
  • Операторы shift должны иметь расширенный тип в качестве первого операнда (CS9320).
  • Не объявляйте определяемые пользователем операторы в блоках расширений, расширяющих статические классы (CS9321).
  • При расширении структуры с помощью операторов экземпляра используйте ref модификатор для параметра приемника (CS9322).
  • Не объявляйте операторы экземпляра для типов, которые не ограничены как структурой, так и классом (CS9323).
  • CS1100: метод имеет модификатор параметров "this", который не относится к первому параметру
  • CS1101: модификатор параметров 'ref' нельзя использовать с 'this'.
  • CS1105: методы расширения должны быть статическими.
  • CS1110: не удается определить новое расширение, так как не удается найти требуемый тип ExtensionAttribute компилятора. Отсутствует ссылка на System.Core.dll?
  • CS1112: не используйте "ExtensionAttribute". Используйте ключевое слово 'this' вместо него.

Эти ошибки относятся к методам расширения, в которых получатель объявляется путем добавления this модификатора в первый параметр. Дополнительные сведения см. в разделе "Методы расширения".

Чтобы правильно объявить this методы расширения параметров, выполните следующие требования в дополнение к общим правилам:

  • Добавьте модификатор static в метод (CS1105).
  • Примените модификатор параметров только к первому параметру this (CS1100).
  • Не сочетайте ref модификатор с модификатором this (CS1101). Чтобы использовать ref, преобразуйте его в блок расширения.
  • Добавьте ссылку в приложения .NET Framework на System.Core.dll (CS1110).
  • this Используйте модификатор для первого параметра вместо непосредственного применения атрибута ExtensionAttribute (CS1112).