Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Вы можете столкнуться со следующими ошибками, связанными с объявлениями свойств:
- 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другим идентификатором, или используйте@fieldescape-синтаксис для ссылки на переменную (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создаст два разных механизма модификации одного и того же хранилища, что может быть избыточным и привести к неопределенности о том, какой путь модификации следует использовать.
Дополнительные сведения см. в разделе возврат по ссылке и локальные переменные по ссылке и Свойства.