Почему автоматически реализованные свойства должны определять как получить, так и установить методы доступа - PullRequest
31 голосов
/ 08 апреля 2010

Когда мы определяем свойство как

    public string Name {get; set;}

dot net может сделать код наших свойств. но когда мы используем

    public string Name {get;}
    public string Name {set;}

мы сталкиваемся с

'Hajloo.SomeThing.PropertyName.set' must declare a body because it is not marked abstract or extern. Automatically implemented properties must define both get and set accessors.

На самом деле, почему компилятор не может определить свойство и создать код автоматически? В чем проблема?

Ответы [ 3 ]

58 голосов
/ 08 апреля 2010

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

Реализация свойства с

  • просто получить: означает, что вы можете только получить значения. Вы никогда не сможете установить значение свойства (даже в содержащем классе)
  • просто установить: означает, что вы можете установить только значения. Вы не можете получить значение свойства.

для обычного свойства

private int _data;
public int Data{  get { return _data } };

Здесь родительский класс может делать следующее где-то еще в классе (чего нельзя сделать с помощью автоматического реквизита)

_data = 100;

Примечание. Вы можете определить автоподдержку следующим образом (именно так я чаще всего ее использую).

public int Data { get; private set;}

Это означает, что свойство не может быть установлено внешними клиентами класса. Однако сам содержащий класс может устанавливать свойство несколько раз с помощью this.Data = x; в определении класса.

5 голосов
/ 08 апреля 2010

Если нет установщика, свойство никогда не может иметь ничего, кроме значения по умолчанию, поэтому не служит никакой цели.

2 голосов
/ 21 февраля 2018

Более современный сценарий для получения этой ошибки - сборка кода, который использует синтаксис C # 6 с использованием версии VisualStudio, которая меньше VS 2015 (или с использованием MsBuild, которая меньше 14).

В C # 6.0 допустимо иметь свойства autoProperties, которые не имеют установщика (предполагается, что он является частным набором).

Попробуйте скомпилировать с VS2015 + или msbuild 14+ .. или измените код так, чтобы все autoProperties имели установщик.

...