Ошибки и предупреждения, связанные с объявлениями свойств

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

  • CS0200: Нельзя присвоить значение свойству или индексатору 'свойство' — он доступен только для чтения.
  • CS0273: модификатор доступа аксессора 'accessor' должен быть более строгим, чем модификатор свойства или индексатора 'property'.
  • CS0274: Не удается указать модификаторы доступа для обоих акцессоров свойства или индексатора "свойство".
  • CS0275: «акцессор»: модификаторы доступа не могут использоваться для акцессоров в интерфейсе
  • CS0276: "property": модификаторы доступа для методов доступа могут использоваться только в том случае, если свойство или индексатор имеет как модификатор получения, так и модификатор установки.
  • CS0442: "property": абстрактные свойства не могут иметь частные методы доступа
  • CS0544: "свойство": не удается переопределить, так как "member" не является свойством
  • CS0545: «функция»: невозможно переопределить, поскольку у свойства нет доступного для переопределения метода доступа get.
  • CS0546: "аксессор": не удается переопределить, так как свойство не имеет переопределяемого модуля доступа set
  • CS0547: "'свойство'" или индексатор не могут иметь тип void
  • CS0548: [property]: свойство или индексатор должны иметь как минимум один метод доступа
  • CS0571: «function»: не может напрямую вызывать оператор или аксессор.
  • CS0610: поле или свойство не может иметь тип "type"
  • CS0840: "Имя свойства" должно объявлять текст, так как он не помечен абстрактным или экстерном. Автоматически реализованные свойства должны определять как методы доступа get, так и set.
  • CS1014: ожидается аксессор get или set
  • CS1043: { или ; ожидается
  • CS1715: "type": тип должен быть "type", чтобы соответствовать переопределённому члену "member"
  • CS8050: только автоматически реализованные свойства или свойства, использующие ключевое слово field, могут иметь инициализаторы.
  • CS8051: у автоматически реализованных свойств должны быть методы доступа.
  • CS8053: свойства экземпляра в интерфейсах не могут иметь инициализатор.
  • CS8080: автоматически реализованные свойства должны переопределить все методы доступа переопределенного свойства.
  • CS8145: автоматически реализованные свойства не могут возвращаться по ссылке
  • CS8147: свойства, возвращаемые по ссылке, не могут иметь наборы методов доступа
  • CS8341: автоматически реализуемые свойства экземпляра в структуре только для чтения должны быть только для чтения.
  • CS8657: статический член "member" не может быть помечен как readonly.
  • CS8658: Автоматически реализованный аксессор 'set' 'accessor' не может быть помечен как readonly.
  • CS8659: автоматически реализованное свойство "property" не может быть помечено как readonly, так как у него есть аксессор set.
  • CS8660: Нельзя указывать модификаторы 'readonly' для свойства или индексатора 'свойство' и его аксессора. Удалите один из них.
  • CS8661: Нельзя указывать модификаторы readonly для обоих методов доступа свойства или индексатора "свойство". Вместо этого поместите модификатор readonly на самом свойстве.
  • CS8664: "property": "readonly" можно использовать только для методов доступа, если свойство или индексатор имеет как get, так и метод доступа set
  • CS8852: Свойство или индексатор init-only можно присваивать только в инициализаторе объекта или в 'this' или 'base' в конструкторе экземпляра или аксессоре 'init'.
  • CS8853: "member" должен соответствовать только для инициализации переопределённого элемента "member"
  • CS8855: аксессоры "accessor" и "accessor" должны быть только для инициализации или вообще не должны быть таковыми
  • CS8856: метод доступа "init" недопустим для статических элементов
  • CS8903: аксессоры init не могут быть помечены как readonly. Вместо этого свойство следует пометить как readonly.
  • CS9029: Типы и псевдонимы не могут называться "обязательными".
  • CS9030: Элемент должен быть обязательным, так как он переопределяет обязательный элемент "member"
  • CS9031: обязательный элемент "member" не может быть скрыт "участником".
  • CS9032: обязательный член не может быть менее видимым или иметь сеттер с меньшей видимостью, чем видимость содержащего типа.
  • CS9033: не используйте "System.Runtime.CompilerServices.RequiredMemberAttribute'. Вместо этого используйте ключевое слово "обязательный" для обязательных полей и свойств.
  • CS9034: обязательный элемент должен быть изменяемым.
  • CS9035: обязательный элемент должен быть задан в конструкторе объектов или конструкторе атрибутов.
  • CS9036: обязательный член "memberName" должен быть назначен значением, он не может использовать вложенный элемент или инициализатор коллекции.
  • CS9037: обязательный список элементов для типа неправильно сформирован и не может быть интерпретирован.
  • CS9038: обязательный список элементов для базового типа "type" неправильно сформирован и не может быть интерпретирован. Чтобы использовать этот конструктор, примените атрибут 'SetsRequiredMembers'.
  • CS9039: Этот конструктор должен добавить "SetsRequiredMembers", так как он связан с конструктором с этим атрибутом.
  • CS9040: тип не может удовлетворить ограничение "new()" для параметра в универсальном типе или методе, так как он имеет необходимые элементы.
  • CS9042: Обязательный член не должен быть помечен как "ObsoleteAttribute", если содержащий тип не устарел или все конструкторы не устарели.
  • CS9045: обязательные члены не допускаются на верхнем уровне скрипта или отправки.
  • CS9258: в этой языковой версии ключевое слово "field" привязывается к синтезируемом поле резервного копирования для свойства. Чтобы избежать создания синтезированного поля резервной копии, а также для ссылки на существующий элемент, используйте вместо него "this.field" или "@field".
  • CS9263: частичное свойство не может иметь инициализатор для определения и реализации.

Для свойств, поддерживаемых полем, можно создать следующие предупреждения:

  • CS9264: свойство "property", не допускающее значение NULL, должно содержать ненулевое значение при выходе из конструктора. Рассмотрите возможность добавления модификатора "обязательно" или объявления свойства как допускающего значение NULL или безопасной обработки случая, когда "field" имеет значение NULL в методе доступа "get".
  • CS9266: Аксессор свойства "property" должен использовать "field", так как другой аксессор использует его.
  • CS9273: в этой языковой версии "field" является ключевым словом в методе доступа к свойствам. Переименуйте переменную или используйте вместо него идентификатор@field.

В следующих разделах объясняется причина и исправление этих ошибок и предупреждений.

доступность аксессора

  • CS0273: модификатор доступа аксессора 'accessor' должен быть более ограничительным, чем у свойства или индексатора 'property'.
  • CS0274: не удается указать модификаторы специальных возможностей для обоих методов доступа свойства или индексатора "свойство".
  • CS0275: "accessor": модификаторы специальных возможностей не могут использоваться для методов доступа в интерфейсе
  • CS0276: "property": модификаторы доступа у аксессоров могут использоваться только в том случае, если свойство или индексатор имеет как метод get, так и метод set.
  • CS0442: "property": абстрактные свойства не могут иметь частные методы доступа

Эти ошибки обеспечивают соблюдение правил для модификаторов доступа к аксессорам свойств и индексаторов. Полные правила см. в разделе "Ограничение специальных возможностей иметодов доступа " в спецификации C#. Чтобы исправить эти ошибки, примените одно из следующих изменений на основе конкретной диагностики:

  • Используйте модификатор доступа, который является более строгим, чем объявленная доступность свойства (CS0273). Например, internal свойство может иметь метод private установки, но не метод public. Доступность аксессора должна являться истинным подмножеством доступности свойства.
  • Примените модификатор доступа только к одному из двух методов доступа (CS0274). Само объявление свойства устанавливает специальные возможности по умолчанию для обоих методов доступа, и только один метод доступа может отличаться от этого по умолчанию. Поместите модификатор доступа на тот аксессор, которому нужен ограниченный доступ.
  • Удалите модификаторы доступа из методов доступа в объявлениях свойств интерфейса (CS0275). Члены интерфейса определяют открытый контракт, и модификаторы доступа для отдельных аксессоров не допускаются. Если необходимо ограничить доступ, примените ограничение в реализуемом классе.
  • Добавьте как get, так и set методы доступа к свойству, прежде чем применять модификатор доступа к любому из них (CS0276). Модификаторы доступа для методов доступа отличают видимость одного метода доступа от другого, что требует наличия обоих методов доступа. Если свойство имеет только один метод доступа, удалите из него модификатор доступа.
  • Измените модификатор доступа у абстрактных методов доступа свойств с private на менее строгий модификатор (CS0442). Абстрактные члены должны быть доступны производным классам, чтобы эти классы могли предоставлять реализации. Используйте protected, internalили protected internal вместо private.

Для получения дополнительной информации см. Ограничение доступа к акцессорам и Свойства.

Синтаксис объявления свойств

  • CS0547: свойство или индексатор не могут иметь тип void
  • CS0548: 'property': свойство или индексатор должны иметь по крайней мере один акцессор
  • CS0571: function: не может явно вызывать оператор или метод доступа.
  • CS0610: поле или свойство не может иметь тип "type"
  • CS0840: "Имя свойства" должно объявлять тело, так как оно не помечено как абстрактное или внешнее. Автоматически реализованные свойства должны определять методы доступа как get, так и set.
  • CS1014: ожидается аксессор get или set
  • CS1043: { или ; ожидается

Эти ошибки обеспечивают соблюдение структурных требований к объявлениям свойств и индексаторов. Полные правила см. в разделе "Свойства " и " Свойства " спецификации C#. Чтобы исправить эти ошибки, примените одно из следующих изменений на основе конкретной диагностики:

  • Измените тип свойства с void на допустимый тип (CS0547). Свойства и индексаторы представляют выражения и void не являются допустимым типом выражения. Выберите подходящий тип для данных, которые представляет свойство.
  • Добавьте по крайней мере один аксессор (get, set или init) в объявление свойства (CS0548). Свойство без каких-либо методов доступа не имеет способа считывания или записи его значения. Включите get метод доступа, set метод доступа или init, или оба.
  • Используйте синтаксис свойств для доступа к свойствам, вместо прямого вызова методов аксессоров (CS0571). Методы доступа к свойствам компилируются в методы с именем get_PropertyName и set_PropertyName, но вызывают эти методы с помощью синтаксиса свойств (obj.Property и obj.Property = value). Тот же принцип применяется к операторам. Используйте синтаксис оператора (++obj) вместо вызова таких методов op_Increment.
  • Измените тип поля или свойства с ограниченного типа на разрешенный тип (CS0610). Некоторые типы, такие как TypedReference и ArgIterator не могут использоваться в качестве полей или свойств. Эти типы по-прежнему можно использовать в качестве параметров метода или локальных переменных.
  • Для свойства только для чтения объявите автоматически реализуемое свойство get. В противном случае добавьте аксессоры get и set к автоматически реализуемым объявлениям свойств или предоставьте явные тела аксессоров (CS0840). Для свойства, требующего пользовательской логики, используйте field ключевое слово, добавленное в C# 13, чтобы получить доступ к полю резервной копии, синтезированной компилятором в тексте метода доступа. Для abstract или extern свойств удалите тела аксессоров, где реализация предоставляется в другом участке кода. Для partial свойств разделите объявление и реализацию по объявлениям частичного типа.
  • Убедитесь, что тело свойства содержит только допустимые ключевые слова доступа — get, set или init (CS1014). Тела свойств не могут содержать произвольные инструкции или объявления членов. Переместите поля и методы за пределы свойства в тело класса или структуры.
  • Используйте правильный синтаксис доступа к свойствам с фигурными скобками или телами выражений (CS1043). Тела акцессоров должны использовать фигурные скобки { }, акцессоры с телом-выражением должны использовать => синтаксис, а автоматически реализованные свойства должны заканчиваться точкой с запятой после токена акцессора.

Дополнительные сведения см. в разделе "Свойства", " Автоматически реализованные свойства" и "Использование свойств".

Переопределения свойств

  • CS0544: "свойство": не удается переопределить, так как "member" не является свойством
  • CS0545: 'function': невозможно переопределить, так как 'property' не имеет переопределяемого аксессора get.
  • CS0546: accessor: невозможно переопределить, поскольку у свойства нет переопределяемого set-аксессора
  • CS1715: 'type': тип должен быть 'type', чтобы соответствовать переопределенному члену 'member'
  • CS8080: автоматически реализованные свойства должны переопределить все методы доступа переопределенного свойства.

Эти ошибки обеспечивают соблюдение правил для переопределения свойств в производных классах. Полные правила см. в разделе Наследование и в разделе Виртуальные, запечатанные, переопределяемые и абстрактные аксессоры спецификации C#. Чтобы исправить эти ошибки, примените одно из следующих изменений на основе конкретной диагностики:

  • Убедитесь, что элемент, который вы переопределяете, является свойством, а не полем или методом (CS0544). Ключевое override слово для свойства может быть предназначено только для свойства virtual, abstract или override в базовом классе. Чтобы скрыть член, не являющийся свойством, используйте ключевое слово new вместо override.
  • Переопределите только те методы доступа, которые существуют в объявлении свойств базового класса (CS0545, CS0546). Невозможно переопределить метод доступа к свойствам, который отсутствует или доступен в базовом классе, так как не существует виртуального метода для переопределения. Если свойство базового класса имеет только get метод доступа, нельзя добавить set метод доступа через переопределение. Добавьте отсутствующий метод доступа к базовому классу и пометьте его virtualили используйте new для скрытия свойства базового класса с новым определением свойства.
  • Приведите в соответствие тип переопределяющего свойства и тип переопределяемого элемента (CS1715). Свойства только для чтения (get) поддерживают ковариантные типы возвращаемых значений начиная с C# 9, поэтому переопределение может возвращать более производный тип. Однако свойства, имеющие set или init метод доступа, требуют точного сопоставления типов, так как метод задания принимает значения объявленного типа. Если требуется другой тип свойства с методом задания, измените тип свойства в производном классе, чтобы соответствовать объявлению базового класса, или удалите метод задания и используйте вместо него ковариантный возвращаемый тип.
  • Включите все методы доступа из базового свойства при переопределении с автоматически реализованным свойством (CS8080). Автоматически реализованные свойства создают как хранилище, так и методы доступа, поэтому они должны переопределять все методы доступа, присутствующие в базовом классе. Если базовое свойство имеет как get, так и set, то автоматически реализуемое переопределение должно иметь их оба. Чтобы переопределить только определенные методы доступа, реализуйте свойство с явными телами доступа и явным полем резервного копирования вместо использования автоматической реализации.

Дополнительные сведения см. в разделе "Наследование", "Свойства" и "Использование свойств".

Свойства, поддерживаемые полем

  • CS9258: в этой языковой версии ключевое слово "field" привязывается к синтезируемом поле резервного копирования для свойства. Чтобы избежать создания синтезированного поля резервной копии, а также для ссылки на существующий элемент, используйте вместо него "this.field" или "@field".
  • CS9263: частичное свойство не может иметь инициализатор для определения и реализации.
  • CS9264: Свойство "property", не допускающее NULL, должно содержать ненулевое значение при выходе из конструктора. Рассмотрите возможность добавления модификатора 'required', объявления свойства как допускающего NULL или безопасно обработать случаи, когда "field" имеет значение NULL в аксессоре "get".
  • CS9266: Аксессор свойства "property" должен использовать "field", так как другой аксессор использует его.
  • CS9273: в этой языковой версии "field" является ключевым словом в методе доступа к свойствам. Переименуйте переменную или используйте вместо него идентификатор@field.

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

  • Переименуйте любую переменную, именуемую field другим идентификатором, или используйте @field escape-синтаксис для ссылки на переменную (CS9258, CS9273). Это исправление необходимо, так как field это контекстное ключевое слово в методах доступа к свойствам в C# 13 и более поздних версиях, где оно ссылается на поле резервной копии, синтезированное компилятором. Если вы хотите получить доступ к существующему элементу field вместо синтезированного поля резервной копии, присвойте ему this.field значение, чтобы отсоединить ссылку.
  • Удалите инициализатор из определения частичного свойства или реализации, сохраняя только один (CS9263). Это исправление необходимо, так как разрешение инициализаторов в обоих местах приведет к неоднозначности использования значения и может привести к инициализации вспомогательного поля дважды с возможными разными значениями.
  • [field: MaybeNull, AllowNull] Добавьте атрибуты к объявлению свойства, чтобы указать, что резервное поле должно рассматриваться как допускающее значение NULL (CS9264). Это исправление приводит в соответствие ожидания nullability между типом свойства и вспомогательным полем, созданным компилятором, устраняет несоответствие, при котором свойство объявлено как ненулевое, но использование ключевого слова field предполагает, что оно может иметь значение NULL. В качестве альтернативы измените тип свойства на допускающий значение null, добавьте модификатор required для обеспечения инициализации, или инициализируйте свойство в конструкторе.
  • Последовательно используйте ключевое field слово в обоих методах доступа или используйте явное поле резервного копирования в обоих методах доступа (CS9266). Это исправление предотвращает потенциальные ошибки, когда один метод доступа изменяет поле резервной копии компилятора, синтезированное в то время как другой метод доступа изменяет другое расположение хранилища, что приводит к несогласованному поведению свойств.

Дополнительные сведения см. в разделе "Ключевое слово поля " и "Частичные свойства".

Свойства Readonly

  • CS0200: Свойству или индексатору "свойство" нельзя присвоить значение: оно доступно только для чтения.
  • CS8341: Свойства экземпляра с автоматической реализацией в структурах, доступных только для чтения, должны быть только для чтения.
  • CS8657: статический член "member" не может быть помечен как readonly.
  • CS8658: автоматически реализованный аксессор 'set' не может быть помечен как 'readonly'.
  • CS8659: автоматическое реализация свойства "property" не может быть помечена как readonly, так как он имеет метод доступа set.
  • CS8660: Невозможно указать модификаторы readonly на обоих, свойстве и индексаторе 'property', и их аксессоре. Удалите один из них.
  • CS8661: Нельзя указывать модификаторы readonly для обоих методов доступа свойства или индексатора 'свойство'. Вместо этого укажите модификатор readonly для самого свойства.
  • CS8664: "property": "readonly" можно использовать только на аксессорах, если свойство или индексатор имеют как аксессор get, так и аксессор set

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

  • Добавьте аксессор set или init к свойству, чтобы сделать его доступным для записи (CS0200). Это исправление необходимо, так как свойства без заданных методов доступа доступны только для чтения и могут быть назначены только в конструкторе декларативного типа или инициализаторе полей. Если необходимо, чтобы свойство было задано во время инициализации объектов, но неизменяемое после этого, используйте init метод доступа вместо set метода доступа. Если свойство должно оставаться доступным только для чтения, переместите присвоение в конструктор, где разрешена инициализация, или пересмотрите необходимость в присвоении вообще.
  • Помечайте автоматически реализованные свойства экземпляра, как readonly при объявлении их внутри readonly struct (CS8341). Это исправление применяет контракт на неизменяемость структуры, гарантируя, что все члены экземпляра соблюдают гарантию readonly. Если свойство должно быть изменяемым, удалите readonly модификатор из объявления структуры или реализуйте свойство с явным резервным полем и телами доступа, которые не изменяют состояние экземпляра.
  • Удалите модификатор readonly из объявлений статических свойств или аксессоров (CS8657). Это исправление необходимо, так как readonly модификатор применяется только к элементам экземпляров структур, чтобы указать, что они не изменяют состояние экземпляра, а статические элементы не имеют состояния экземпляра для защиты. Если требуется статическое свойство только для чтения, просто опустите set аксессор вместо использования readonly модификатора.
  • readonly Удалите модификатор из автоматически реализованных set аксессоров или примените его только к аксессору get (CS8658). Это исправление необходимо, так как set методы доступа по сути изменяют состояние, которое противоречит назначению readonly модификатора, гарантирующего отсутствие изменения состояния экземпляра. Если вам требуется свойство, которое можно установить во время инициализации, но которое затем становится только для чтения, используйте init акцессор вместо set акцессора.
  • Удалите модификатор readonly из объявления свойства, когда свойство имеет аксессор set (CS8659). Это исправление необходимо, так как свойства с set аксессорами могут изменять состояние экземпляра, что нарушает гарантию readonly. Если вам нужно задавать свойство только во время инициализации, замените аксессор set на аксессор init или полностью удалите аксессор set, чтобы сделать свойство действительно доступным только для чтения.
  • readonly Поместите модификатор в объявление свойства или на отдельные методы доступа, но не оба (CS8660, CS8661). Это исправление предотвращает избыточные объявления модификатора, которые могут привести к путанице о том, какой модификатор получает приоритет. Если вы хотите пометить определенные методы доступа как readonly, удалите модификатор из объявления свойства и поместите его только на методы доступа. Кроме того, если все методы доступа должны быть readonly, помечайте само свойство, а не отдельные методы доступа.
  • Убедитесь, что оба метода доступа get и set присутствуют при определении отдельных методов доступа как readonly (CS8664). Это исправление необходимо, так как модификатор readonly на отдельных методах доступа позволяет различать методы, которые изменяют состояние, и те, которые этого не делают, что имеет смысл только в случае, если существуют оба типа методов доступа. Если свойство имеет только get метод доступа, пометьте все свойство как readonly, а не отдельный метод доступа.

Дополнительные сведения см. в разделе "Элементы экземпляра чтения", ключевое слово init и свойства.

Свойства только для инициализации

  • CS8852. Свойству или индексатору с модификатором init-only можно присваивать значение только в инициализаторе объекта, в операторе 'this' или 'base' в конструкторе экземпляра, или в методе доступа 'init'.
  • CS8853: "member" должен совпадать с только для инициализации переопределенного члена "member"
  • CS8855: методы доступа "accessor" и "accessor" должны быть либо только для инициализации, либо вовсе не должны быть такими
  • CS8856: аксессор "init" недопустим для статических членов
  • CS8903: Аксессоры "init" не могут быть помечены как "readonly". Свойство должно быть помечено "readonly" вместо этого.

Эти ошибки применяют правила для init метода доступа, что позволяет инициализации неизменяемых объектов. Полные правила смотрите в ключевом слове init. Чтобы исправить эти ошибки, примените одно из следующих изменений на основе конкретной диагностики:

  • Переместите присваивания в свойства, имеющие доступ только для инициализации, в инициализатор объекта, конструктор или init метод доступа (CS8852). Свойства только для инициализации не могут быть назначены после завершения построения объекта. Назначьте значение в теле конструктора, аксессор init, или выражение инициализатора объекта (new MyType { Property = value }). Если необходимо назначить свойство после создания, измените init аксессор на set аксессор.
  • Совместите тип акцессора init или set при переопределении свойства (CS8853). Если свойство базового класса использует аксессор init, свойство переопределения должно также использовать init. Аналогичным образом, если база использует set, переопределение должно использовать set. Эта согласованность гарантирует, что неизменяемый контракт, установленный базовым типом, сохраняется в производных типах.
  • Используйте один и тот же тип метода доступа (init или set) для обоих методов доступа в явной реализации интерфейса (CS8855). Если тип явно реализует два интерфейса, объявляющие одно и то же свойство, обе реализации методов доступа должны совпадать: либо обе используют init, либо обе используют set.
  • init Удалите метод доступа из объявлений статических свойств или измените его на set метод доступа (CS8856). Аксессор init предназначен для шаблонов инициализации экземпляров, связанных с созданием объектов, а статические элементы не участвуют в инициализации объекта. set Используйте акцессор для изменяемых статических свойств или полностью удалите сеттер для статических свойств с доступом только для чтения.
  • Удалите readonly модификатор из init метода доступа (CS8903). Модификатор readonly члена структуры гарантирует, что член не изменяет экземпляр структуры. Поскольку аксессор изменяет состояние экземпляра init, он мутирует структуру и не может быть отмечен как readonly. Чтобы сделать метод доступа getreadonly, примените модификатор readonly только к методу доступа get.

Дополнительные сведения см. в разделе оператор init и Инициализаторы объектов и коллекций.

Инициализаторы свойств

  • CS8050: только автоматически реализованные свойства или свойства, использующие ключевое слово field, могут иметь инициализаторы.
  • CS8051: у автоматически реализованных свойств должны быть методы доступа.
  • CS8053: свойства экземпляра в интерфейсах не могут иметь инициализаторы.

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

  • Преобразуйте свойство для использования автоматического синтаксиса, удалив модификаторы доступа и позволяя компилятору автоматически создавать поле (CS8050). Это исправление необходимо, так как только свойства, управление которыми осуществляется компилятором, могут иметь инициализаторы, что обеспечивает инициализацию перед выполнением любой логики доступа к этим свойствам. Кроме того, измените реализацию метода доступа, чтобы использовать field ключевое слово для доступа к полю резервной копии, синтезированной компилятором. Этот подход позволяет активировать инициализатор при сохранении логики пользовательского доступа. Если ни один из подходов не подходит, удалите инициализатор и назначьте значение в конструкторе, где у вас есть полный контроль над последовательностью инициализации.
  • get Добавьте метод доступа к свойству автоматической реализации, чтобы включить чтение инициализированного значения (CS8051). Это исправление необходимо, так как инициализаторы задают значение, которое должно быть извлечено, а свойство только для записи нарушает это базовое ожидание инициализации свойств. Если вам действительно требуется свойство только для записи, реализуйте методы доступа явным образом с резервным полем и назначьте поле непосредственно в конструкторе, а не с помощью инициализатора свойств.
  • Удалите инициализатор из объявлений свойств интерфейса (CS8053). Это исправление необходимо, так как интерфейсы определяют контракты для реализации типов, а не предоставляют конкретные реализации с начальными значениями. Если необходимо предоставить значения по умолчанию, реализуйте свойство в классе, реализующего интерфейс, или используйте методы интерфейса по умолчанию (доступные в C# 8.0 и более поздних версиях), чтобы предоставить реализацию по умолчанию.

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

Обязательные члены

  • CS9029: Типы и псевдонимы не могут называться "обязательными".
  • CS9030: "member" должен быть требуемым, так как он переопределяет требуемый член "member"
  • CS9031: обязательный элемент "member" не может быть скрыт "участником".
  • CS9032: Обязательный элемент не может быть менее видимым или иметь метод установки менее видимым, чем содержащий тип.
  • CS9033: не используйте "System.Runtime.CompilerServices.RequiredMemberAttribute'. Вместо этого используйте ключевое слово "обязательный" для обязательных полей и свойств.
  • CS9034: обязательный член должен быть изменяемым.
  • CS9035: обязательный элемент должен быть задан в конструкторе объектов или конструкторе атрибутов.
  • CS9036: обязательный член "memberName" должен быть присвоен значением, он не может использовать вложенный член или инициализатор коллекции.
  • CS9037: обязательный список элементов для типа неправильно сформирован и не может быть интерпретирован.
  • CS9038: обязательный список элементов для базового типа "type" неправильно сформирован и не может быть интерпретирован. Чтобы использовать этот конструктор, примените атрибут 'SetsRequiredMembers'.
  • CS9039: Этот конструктор должен добавить "SetsRequiredMembers", так как он цепляется к конструктору с этим атрибутом.
  • CS9040: тип не может удовлетворить ограничение "new()" для параметра в универсальном типе или методе, так как он имеет необходимые элементы.
  • CS9042: обязательный член не должен быть атрибутирован с "ObsoleteAttribute", если содержащий тип не устарел или все конструкторы не устарели.
  • CS9045: требуемые члены не допускаются на верхнем уровне скрипта или представления.

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

  • Избегайте использования required в качестве имени типа или псевдонима (CS9029). Это исправление необходимо, так как required это контекстное ключевое слово в C# 11 и более поздних версиях, и его использование в качестве имени типа создает неоднозначность в коде, где может появиться ключевое слово.
  • Убедитесь, что производные члены поддерживают модификатор required при переопределении обязательных членов (CS9030). Это исправление применяет контракт, установленный базовым классом, гарантируя, что все производные типы поддерживают одинаковые требования к инициализации. Избегайте скрытия обязательных элементов с не обязательными элементами в производных классах (CS9031), так как это действие нарушает контракт инициализации, который потребители ожидают от базового типа.
  • Сделайте обязательные члены как минимум такими же доступными, как содержащий их тип, и убедитесь, что установщики свойств также обладают достаточной видимостью (CS9032). Это исправление предотвращает ситуации, когда тип является общедоступным, но его обязательные элементы не могут быть инициализированы из всех контекстов, в которых создается тип.
  • Используйте ключевое required слово вместо применения RequiredMemberAttribute вручную (CS9033). Это исправление гарантирует, что компилятор создает правильные метаданные и применяет все необходимые правила члена, которые приложение атрибутов вручную может не правильно выполнять.
  • Убедитесь, что необходимые члены имеют назначенные аксессоры или иным образом могут быть установлены (CS9034). Это исправление необходимо, так как необходимые элементы должны быть инициализированы во время создания объекта, для которого требуется доступ на запись. При создании экземпляров напрямую инициализируйте необходимые элементы в инициализаторах объектов (CS9035, CS9036). Необходимо назначить значение каждому обязательному элементу, а не использовать вложенные инициализаторы элементов или инициализаторы коллекции, так как перед доступом к его свойствам необходимо задать обязательный элемент.
  • Примените SetsRequiredMembers атрибут к конструкторам, которые инициализируют все необходимые элементы в своих телах (CS9038, CS9039). Это исправление сообщает компилятору, что конструктор выполняет обязательный контракт члена, позволяя создавать объекты без инициализаторов объектов. Если конструктор объединяется с другим конструктором, используя SetsRequiredMembers, он также должен иметь этот атрибут.
  • Избегайте использования обязательных элементов в типах, которые должны соответствовать new() ограничению (CS9040), так как конструктор без параметров не может гарантировать обязательное инициализацию элементов без инициализатора объектов. Не помечайте необходимые члены как устаревшие, если содержащий их тип или все конструкторы не устарели (CS9042), чтобы предотвратить ситуации, когда члены необходимы, но их использование не рекомендуется. Обязательные члены не допускаются в инструкциях верхнего уровня или контекстах скриптов (CS9045), так как эти контексты не поддерживают синтаксис инициализации объектов, необходимый для задания обязательных элементов.

Дополнительные сведения см. в справочной статье о необходимых модификаторахи инициализаторах объектов и коллекции .

Свойства, возвращающие ссылки

  • CS8145: автоматически реализованные свойства не могут возвращаться по ссылке
  • CS8147: свойства, возвращаемые по ссылке, не могут иметь наборы методов доступа

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

  • Реализуйте свойство явно с помощью резервного поля и используйте ref ключевое слово в get выражении возврата метода доступа (CS8145). Это исправление необходимо, так как автоматически реализованные свойства создают частное резервное поле, которое компилятор управляет внутренне. При возврате ссылки на закрытое поле будут предоставлены внутренние данные, к которым вызывающие не должны обращаться напрямую. Чтобы создать возвращаемое свойство ref, объявите явное поле и верните его с синтаксисом => ref backingField . Кроме того, если вам не нужно возвращать ссылку, чтобы разрешить прямое изменение хранилища, удалите ref модификатор из объявления свойства.
  • set Удалите метод доступа из возвращаемых свойств ref (CS8147). Это исправление необходимо, поскольку свойство, возвращающее ref, уже предоставляет доступ для чтения и записи через саму возвращаемую ссылку. Вызывающие могут напрямую изменять значение с помощью ссылки без необходимости отдельного метода задания. Добавление метода доступа set создаст два разных механизма модификации одного и того же хранилища, что может быть избыточным и привести к неопределенности о том, какой путь модификации следует использовать.

Дополнительные сведения см. в разделе возврат по ссылке и локальные переменные по ссылке и Свойства.