Подтвердить что ты не робот

Accessor должен быть более ограничительным, чем свойство или индекс

У меня есть следующий класс:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Odbc;

namespace Framework
{
    public class OracleProvider
    {
        private OdbcConnection db { get; private set; }
        private String dbUsername = Settings.Default.Username;
        private String dbPassword = Settings.Default.Password;

        public OracleProvider()
        {
            connect();
        }

        public void connect()
        { 
            db = new OdbcConnection("Driver={Microsoft ODBC for Oracle};Server=CTIR; UID="+dbUsername+";PWD="+dbPassword+";");    
        }        
    }
}

Теперь я получаю следующую ошибку:

Ошибка 11: Модификатор доступности Accessor'OracleProvider.db.set должен быть более строгим, чем свойство или indexer 'Framework.OracleProvider.db'

Я рассматривал похожие вопросы, но на самом деле не нашел ответа.

Может кто-нибудь объяснить мне, почему это происходит? Я действительно хочу учиться.

4b9b3361

Ответ 1

В этом проблема:

private OdbcConnection db { get; private set; }

Предполагая, что вы действительно хотите, чтобы и getter, и setter были закрытыми, это должно быть:

private OdbcConnection db { get; set; }

Установщик уже private, так как это доступность общего свойства.

В качестве альтернативы, если вы хотите, чтобы геттер не был закрыт, а сеттер был закрытым, вам нужно указать какой-либо другой модификатор, например.

internal OdbcConnection db { get; set; }

В принципе, если вы укажете модификатор доступа в части свойства get; или set; свойства, он должен быть более строгим, чем в противном случае.

Из раздела 10.7.2 спецификации С#:

Модификатор-модификатор должен объявить доступность, которая является строго более ограничительной, чем объявленная доступность самого свойства или индексатора. Если быть точным:

  • Если свойство или индекс имеет объявленную доступность public, модификатор-модификатор может быть либо protected internal, internal, protected, либо private.
  • Если свойство или индекс имеет объявленную доступность protected internal, модификатор-модификатор может быть либо internal, protected, либо private.
  • Если свойство или индекс имеет объявленную доступность internal или protected, модификатор-модификатор должен быть private.
  • Если свойство или индексатор имеет объявленную доступность private, модификатор-модификатор не может быть использован.

(Как в стороне, если он частный для чтения и письма, вероятно, было бы лучше просто использовать поле. Большинство преимуществ использования свойства присутствуют только в том случае, если оно открыто за пределами текущего класса. И если вы сохраните его как свойство, подумайте над переименованием его, чтобы он соответствовал нормальным соглашениям об именах .NET.)

Ответ 2

Ну, ошибка сообщает всю необходимую информацию:

модификатор доступности... accessor должен быть более ограничивающим, чем свойство...

  private OdbcConnection db { // <- property as whole is "private"
    get; 
    private set; // <- accessor (set) is explictly declared as "private" 
  }

Итак, вы можете сделать

  // property as a whole is "public", but "set" accessor is "private"
  // and so the accessor is more restrictive than the property
  public OdbcConnection db { // <- property as whole is "public"
    get; 
    private set; // <- accessor is "private" (more restrictive than "public")
  }

или

  private OdbcConnection db { 
    get; 
    set; // <- just don't declare accessor modifier
  }