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


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

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

  • CS0132: "конструктор": статический конструктор должен быть без параметров.
  • CS0514: в статическом конструкторе не может быть явного вызова конструктора "this" или "base".
  • CS0515: модификаторы доступа запрещены для статических конструкторов.
  • CS0516: конструктор не может вызывать себя.
  • CS0517: "class" не имеет базового класса и не может вызывать базовый конструктор.
  • CS0522: структуры не могут вызывать конструкторы базового класса.
  • CS0526: интерфейсы не могут содержать конструкторов.
  • CS0568: структуры не могут содержать явные конструкторы без параметров.
  • CS0573: объявление поля: нельзя использовать инициализаторы полей экземпляра в структурах.
  • CS0710: статические классы не могут иметь конструкторы экземпляров.
  • CS0768: конструктор не может вызываться с помощью другого конструктора.
  • CS1018: Ожидается ключевое слово "this" или "base".
  • CS8054: перечисления не могут содержать явные конструкторы без параметров.
  • CS8091: не может быть экстерном и иметь инициализатор конструктора.
  • CS8861: список непредвиденных аргументов.
  • CS8862: Конструктор, объявленный в типе со списком параметров, должен иметь инициализатор конструктора this.
  • CS8358: не удается использовать конструктор атрибутов, так как он имеет параметры in.
  • CS8867: Конструктор доступных копий не найден в базовом типе "{0}".
  • CS8868: Конструктор копирования в записи должен вызывать конструктор копирования базового класса или конструктор объекта без параметров, если запись наследует от объекта.
  • CS8878: конструктор копирования "{0}" должен быть общедоступным или защищенным, так как запись не запечатана.
  • CS8910: главный конструктор конфликтует с синтезированным конструктором копирования.
  • CS8958: Конструктор структуры без параметров должен быть открытым.
  • CS8982: Конструктор, объявленный в структуре со списком параметров, должен иметь инициализатор "this", который вызывает основной конструктор или явно объявленный конструктор.
  • CS8983: Структура с инициализаторами полей должна содержать явно объявленный конструктор.
  • CS9105: невозможно использовать в этом контексте основной параметр конструктора.
  • CS9106: идентификатор является неоднозначным между типом и параметром в этом контексте.
  • CS9108: не удается использовать параметр, имеющий тип ref внутри анонимного метода, лямбда-выражения, выражения запроса или локальной функции.
  • CS9109: не удается использовать ref, outили in первичный параметр конструктора внутри элемента экземпляра.
  • CS9110: Не удается использовать основной параметр конструктора, имеющий тип ref-like внутри элемента экземпляра.
  • CS9111: анонимные методы, лямбда-выражения, выражения запросов и локальные функции внутри члена экземпляра структуры не могут получить доступ к параметру основного конструктора.
  • CS9112: анонимные методы, лямбда-выражения, выражения запросов и локальные функции внутри структуры не могут получить доступ к основному параметру конструктора, который также используется внутри элемента экземпляра.
  • CS9114: первичному параметру конструктора типа только для чтения не может быть присвоено значение (за исключением инициализатора только для init или инициализатора переменной).
  • CS9115: первичный параметр конструктора типа только для чтения не может быть возвращен ссылкой для записи.
  • CS9116: основной параметр конструктора типа readonly нельзя использовать для передачи по ref или out (за исключением сеттера, доступного только для инициализации типа, или инициализатора переменной).
  • CS9117: Члены параметров основного конструктора типа readonly не могут быть изменены (за исключением сеттера только для инициализации или инициализатора переменной).
  • CS9118: Элементы основного параметра конструктора типа только для чтения не могут быть возвращены изменяемой ссылкой.
  • CS9119: Члены основного параметра конструктора типа readonly нельзя использовать в качестве значения ref или out (за исключением сеттера, только для инициализации, типа или в инициализаторе переменной).
  • CS9120: Не удается вернуть основной параметр конструктора по ссылке.
  • CS9121: параметр типа в первичном конструкторе структуры вызывает цикл в макете структуры.
  • CS9122: список непредвиденных параметров.
  • CS9136: не удается использовать основной параметр конструктора типа внутри члена объекта.

Кроме того, в этой статье рассматриваются следующие предупреждения:

  • CS0824: Конструктор "name" помечен как внешний.
  • CS9107: параметр записывается в состояние охватывающего типа, и его значение также передается в базовый конструктор. Это значение может быть захвачено и базовым классом.
  • CS9113: параметр нечитабельный.
  • CS9124: параметр фиксируется в состоянии заключенного типа, а его значение также используется для инициализации поля, свойства или события.
  • CS9179: основной параметр конструктора затеняется членом из базового класса
  • CS9018: Автоматически реализованное свойство считывается до явного назначения, что приводит к предыдущему неявному присвоению значения по умолчанию.
  • CS9019: Поле считывается до того, как его явно назначают, что вызывает предшествующее неявное назначение значением "по умолчанию".
  • CS9020: Объект 'this' читается до того, как все его поля были заданы, что приводит к предыдущим неявным назначениям 'по умолчанию' для явно не назначенных полей.
  • CS9021: Управление возвращается вызывающему до явного назначения автоматически реализованного свойства, вызывая неявное назначение значения 'по умолчанию'.
  • CS9022: элемент управления возвращается вызывающему объекту до явного назначения поля, вызывая предыдущее неявное назначение по умолчанию.

Статические конструкторы

  • CS0132: "конструктор": статический конструктор должен быть без параметров.
  • CS0514: статический конструктор не может иметь явный вызов конструктора "this" или "base".
  • CS0515: модификаторы доступа не допускаются для статических конструкторов.

Статические конструкторы инициализируют статические данные для типа. Дополнительные сведения см. в разделе "Статические конструкторы".

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

  • Удалите все параметры из объявления статического конструктора, так как статический конструктор должен быть без параметров (CS0132). Если необходимо передать значения инициализации, рекомендуется использовать статические поля или свойства, заданные перед запуском статического конструктора.
  • Удалите любые модификаторы доступа, такие как public, protected, private или internal из статического конструктора, потому что среда выполнения управляет тем, когда выполняется статический конструктор, и модификаторы доступа не имеют значения (CS0515).
  • Удалите любые : base() вызовы инициализатора : this() конструктора из статического конструктора, так как статические конструкторы не могут вызывать другие конструкторы (CS0514). Среда выполнения автоматически вызывает статический конструктор базового класса, если он существует.

Объявление конструктора

  • CS0526: интерфейсы не могут содержать конструкторы.
  • CS0710: статические классы не могут иметь конструкторы экземпляров.
  • CS8054: Перечисления не могут содержать явные конструкторы без параметров.
  • CS8358: Не удается использовать конструктор атрибутов, так как он имеет параметры in.
  • CS8091: Конструктор не может быть экстерном и иметь инициализатор конструктора.

Конструкторы можно объявлять только в типах class и struct, включая типы record class и record struct. Дополнительные сведения см. в разделе конструкторы экземпляров.

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

Переместите конструктор в тип class или struct тип, так как нельзя объявлять конструкторы в interface или enum типах (CS0526, CS8054). Интерфейсы определяют контракты, но не предоставляют логику инициализации, а типы перечисления определяют их значения во время компиляции.

Удалите конструкторы экземпляров из статических классов, так как статические классы не могут быть инстанцированы и поэтому не могут иметь конструкторы экземпляров (CS0710). Если вам нужна логика инициализации, используйте вместо этого статический конструктор.

Измените in параметры на параметры, передаваемые по значению в конструкторах атрибутов, так как конструкторы атрибутов не поддерживают in модификаторы параметров (CS8358). Среда выполнения создает экземпляры атрибутов с помощью механизма отражения, который не поддерживает модификатор in.

: base() Удалите инициализатор конструктора : this() из extern конструктора, так как экстерн-конструкторы не могут вызывать другие конструкторы (CS8091). Реализация экстерн-конструктора предоставляется внешне, поэтому цепочка конструкторов невозможна.

Следующее предупреждение можно создать для объявлений конструктора:

  • CS0824: конструктор объявлен внешним.

Если конструктор помечается extern, компилятор не может проверить, существует ли реализация. Чтобы отключить это предупреждение, предоставьте не внешнюю реализацию или убедитесь, что внешняя реализация связана корректно.

Конструкторы структурных типов

  • CS0568: структуры не могут содержать явные конструкторы без параметров.
  • CS0573: "объявление поля": в структурах нельзя использовать начальные значения для полей экземпляра.
  • CS8958: Конструктор структуры без параметров должен быть "открытым".
  • CS8982: Конструктор, объявленный в структуре со списком параметров, должен иметь инициализатор "this", который вызывает основной конструктор или явно объявленный конструктор.
  • CS8983: "структуру" с инициализаторами полей должен содержать явно объявленный конструктор.

Типы структур имеют определенные правила для конструкторов и инициализации полей. Дополнительные сведения см. в разделе инициализации структуры и значений по умолчанию статьи "Типы структур ".

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

  • Обновитесь до C# 10 или более поздней версии, если вы столкнетесь с ошибкой CS0568 или ошибкой CS0573, так как эти ошибки возникают только в более ранних версиях C#. Современный C# позволяет определять явные конструкторы без параметров и инициализаторы полей в структурах.
  • Добавьте модификатор доступа public к любому конструктору структуры без параметров, так как такие конструкторы должны быть общедоступными, чтобы обеспечить правильную инициализацию экземпляров структуры и массива default (CS8958).
  • : this(...) Добавьте инициализатор для явно объявленных конструкторов в структуре, которая имеет основной конструктор, так как все конструкторы без параметров должны быть связаны с основным конструктором или другим явно объявленным конструктором, чтобы обеспечить согласованность инициализации (CS8982).
  • Объявите явный конструктор, когда в структуре используются инициализаторы полей, так как компилятору требуется явный конструктор для обеспечения вызова инициализаторов полей (CS8983). Этот конструктор может быть конструктором без параметров и с пустым телом.

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

  • CS9018: автоматически реализованное свойство считывается до того, как ему будет явно назначено значение, что приводит к предшествующему неявному присвоению значения 'по умолчанию'.
  • CS9019: Поле считывается до явного назначения, вызывая предыдущее неявное назначение значения 'по умолчанию'.
  • CS9020: Объект "this" считывается до назначения всех его полей, что вызывает предыдущие неявные присваивания 'по умолчанию' для неявно назначенных полей.
  • CS9021: управление возвращается вызывающему, прежде чем автоматически реализованное свойство явно назначается, что приводит к предыдущему неявному назначению значения по умолчанию.
  • CS9022: управление возвращается вызывающему до явного присваивания поля, что приводит к предыдущему неявному присвоению значения 'по умолчанию'.

Чтобы устранить эти предупреждения, явно присвойте всем полям и автоматически реализованным свойствам значения перед их чтением или перед возвратом управления из конструктора (CS9018, CS9019, CS9020, CS9021, CS9022). Когда неинициализированные члены считываются, компилятор неявно назначает им значение default, что может оказаться непредусмотренным поведением.

Вызовы конструктора с base и this

  • CS0516: Конструктор не может вызывать себя.
  • CS0517: "class" не имеет базового класса и не может вызывать базовый конструктор.
  • CS0522: структуры не могут вызывать конструкторы базового класса.
  • CS0768: Конструктор не может вызывать себя через другой конструктор.
  • CS1018: Ожидается ключевое слово "this" или "base".

Используя инициализаторы конструкторов, один конструктор может вызывать другой конструктор с помощью : this() или : base(). Дополнительные сведения см. в разделе "Использование конструкторов".

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

  • Разорвать цепочки вызовов циклического конструктора, так как конструктор не может вызывать себя напрямую или косвенно с помощью другого конструктора (CS0516, CS0768). Убедитесь, что в цепочке вызовов конструкторов в конечном итоге есть конструктор, который не вызывает другой конструктор в данном типе.
  • : base() Удалите инициализатор из конструкторов в типах структур или из конструкторовSystem.Object, так как эти типы не имеют конструктора базового класса для вызова (CS0517, CS0522). Типы структур неявно наследуются от System.ValueType, но вы не можете явно вызывать его конструктор.
  • Завершите инициализатор конструктора или удалите двоеточие (:) из объявления конструктора, так как когда двоеточие следует сигнатуре конструктора, компилятор ожидает this() либо (base()CS1018). Добавьте соответствующий вызов конструктора или удалите двоеточие полностью, если не предполагается использование цепочки вызовов.

Конструкторы записей и копирования

  • CS8867: Конструктор доступных копий не найден в базовом типе.
  • CS8868: конструктор копирования в записи должен вызывать конструктор копирования базы или конструктор без параметров, если запись наследуется от объекта.
  • CS8878: конструктор копирования должен быть общедоступным или защищенным, так как запись не запечатана.
  • CS8910: основной конструктор конфликтует с синтезированным конструктором копирования.

В производном типе записи явный конструктор копирования должен вызывать конструктор копирования базового типа с помощью инициализатора : this() . Если запись непосредственно наследуется от System.Object, она может вызывать конструктор объекта без параметров (CS8868).

Записи включают конструктор копирования, синтезированный компилятором. Вы можете написать явный конструктор копирования, но он должен соответствовать определенным требованиям. Компилятор создает ошибки, когда конструкторы копирования записей нарушают следующие требования:

  • Базовый тип должен иметь доступный конструктор копирования. Все record типы имеют конструктор копирования. Убедитесь, что базовый тип является record, или добавьте в него доступный конструктор копирования (CS8867).
  • В производном типе записи ваш явный конструктор копирования должен вызывать конструктор копирования базового типа, используя инициализатор : base(). Если запись напрямую наследуется от System.Object, она может вызывать конструктор объекта без параметров (CS8868).
  • Конструкторы копирования должны быть public или protected, если тип записи не является sealed. Добавьте соответствующий модификатор доступа в конструктор копирования (CS8878).
  • Если явный конструктор копирования имеет ту же сигнатуру, что и синтезированный конструктор копирования, то определения конфликтуют. Удалите явный конструктор копирования или измените его подпись (CS8910).

Объявление основного конструктора

Первичные конструкторы объявляют параметры непосредственно в объявлении типа. Компилятор синтезирует поле для хранения основного параметра конструктора при использовании его в элементах или инициализаторах полей.

Цепочка конструкторов

  • CS8861: список непредвиденных аргументов.
  • CS8862: Конструктор, объявленный в типе со списком параметров, должен иметь инициализатор конструктора "this".
  • CS9122: список непредвиденных параметров.

Если тип имеет основной конструктор, все остальные явно объявленные конструкторы должны быть связаны с ним с помощью : this(...). : this(...) Добавьте инициализатор, который передает соответствующие аргументы первичному конструктору (CS8862).

Удалите список параметров из ссылки на базовый тип, если базовый тип не имеет основного конструктора. Синтаксис class Derived : Base(args) действителен только при Base наличии основного конструктора (CS8861). Аналогичным образом удалите список параметров основного interface конструктора из объявления, так как интерфейсы не могут иметь первичного конструктора (CS9122).

Использование параметров в вызовах базового конструктора

  • CS9105: невозможно использовать основной параметр конструктора в этом контексте.
  • CS9106: идентификатор неоднозначен между параметром и типом в этом контексте.

Вы можете использовать только параметры первичного конструктора в вызове базового конструктора, если вы их указываете в объявлении основного конструктора. Чтобы исправить CS9105, переместите использование параметра в базовое выражение объявления типа, вместо того чтобы использовать его в вызове явно объявленного конструктора : base().

Если тип и основной параметр конструктора имеют то же имя, ссылка становится неоднозначной. Чтобы исправить CS9106, переименуйте тип или параметр.

Параметры типа ref-like

  • CS9108: нельзя использовать параметр с типом ref внутри анонимного метода, лямбда-выражения, выражения запроса или локальной функции.
  • CS9109: не удается использовать ref, outили in первичный параметр конструктора внутри элемента экземпляра.
  • CS9110: Не удается использовать основной параметр конструктора, имеющий тип ref-like внутри элемента экземпляра.
  • CS9136: нельзя использовать основной параметр конструктора типа внутри члена экземпляра.

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

  • Основные параметры конструктора ref struct типа имеют ограничения на их использование. Переместите доступ к параметру из лямбда-выражений, выражений запросов или локальных функций (CS9108). В типах, которые не являются ref struct, параметры ref struct следует использовать только в инициализаторах полей или теле конструктора, а не в членах экземпляра (CS9110, CS9136).
  • Для типов ref struct нельзя использовать параметры первичного конструктора с модификаторами in, ref, или out в методах экземпляра или методах доступа к свойствам. Скопируйте значение параметра в поле в конструкторе и вместо этого используйте это поле в членах экземпляра (CS9109).

Ограничения типов структуры

  • CS9111: Анонимные методы, лямбда-выражения, выражения запросов и локальные функции внутри экземпляра члена структуры не могут получить доступ к параметру первичного конструктора.
  • CS9112: анонимные методы, лямбда-выражения, выражения запросов и локальные функции внутри структуры не могут получить доступ к параметру первичного конструктора, который также используется внутри члена экземпляра.
  • CS9120: Невозможно вернуть параметр основного конструктора по ссылке.
  • CS9121: параметр первичного конструктора структуры типа вызывает цикл в макете структуры.

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

  • В типах структур нельзя записывать параметры первичного конструктора в лямбда-выражениях, выражениях запросов или локальных функциях внутри элементов экземпляра. Скопируйте параметр в локальную переменную или поле перед его использованием в этих контекстах (CS9111, CS9112).
  • Нельзя возвращать параметры первичного конструктора по ссылке в типах структур. При необходимости сохраните значение в поле и верните это поле по ссылке (CS9120).
  • Убедитесь, что тип параметра первичного конструктора не создает цикл в структуре. Структура не может содержать поле своего типа, ни напрямую, ни косвенно (CS9121).

Ограничения для структуры типа readonly

  • CS9114: первичный параметр конструктора типа только для чтения не может быть изменен (за исключением инициализатора только для инициализации или сеттера, предназначенного только для инициализации).
  • CS9115: первичный параметр конструктора типа чтения невозможно вернуть по ссылке, доступной для записи.
  • CS9116: основной параметр конструктора типа, доступного только для чтения, нельзя использовать как значение ref или out (за исключением в сеттере инициализации только для типа или инициализатора переменной).
  • CS9117: Члены параметров основного конструктора типа только для чтения не могут быть изменены (за исключением сеттера только для инициализации типа или инициализатора переменной).
  • CS9118: Члены основного параметра конструктора типа только для чтения не могут быть возвращены изменяемой ссылкой.
  • CS9119: Члены параметра основного конструктора типа только для чтения нельзя использовать в качестве ref или out значения (за исключением сеттера с инициализацией только типа или при инициализации переменной).

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

  • В readonly struct типах нельзя изменять параметры первичного конструктора и их члены за пределами установщиков, только для инициализации или начальных инициализаторов переменных. Перенос назначений в инициализаторы полей или сеттеры свойств только для инициализации (CS9114, CS9117).
  • Нельзя возвращать параметры первичного конструктора и их члены через изменяемую ссылку на readonly struct типы. Возврат по readonly ref, или возврат по значению вместо этого (CS9115, CS9118).
  • Невозможно передать параметры первичного конструктора и их члены как ref или out аргументы в readonly struct типах. Передайте их по значению или в качестве in аргументов (CS9116, CS9119).

Предупреждения для захваченных и теневых параметров

  • CS9107: параметр сохраняется в состоянии охватывающего типа, а его значение также передается базовому конструктору. Значение также может быть сохранено базовым классом.
  • CS9113: параметр нечитаем.
  • CS9124: параметр сохраняется в состоянии включающего типа, а его значение также используется для инициализации поля, свойства или события.
  • CS9179: основной параметр конструктора затеняется элементом из базы.

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

  • Параметр может храниться дважды, если вы передаете его базовому конструктору и обращаетесь к нему в производном типе. Возможно, одна копия в базовом классе и другая в производном классе. Рассмотрите необходимость обоих копий или реструктурирования кода, чтобы избежать дублирования (CS9107).
  • Если вы никогда не считываете его, не требуется основной параметр конструктора. Удалите неиспользуемые параметры из объявления основного конструктора (CS9113).
  • Параметр может храниться дважды, если вы записываете его в вложенный тип и используете его для инициализации поля, свойства или события. Вместо инициализации отдельного члена (CS9124) рекомендуется использовать захваченный параметр напрямую.
  • Член базового типа перекрывает основной параметр конструктора, если оба имеют одно и то же имя. Переименуйте параметр, чтобы избежать путаницы (CS9179).