访问者必须比财产或索引器更具限制性

时间:2014-03-06 14:00:01

标签: c#

我有以下课程:

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:'Framework.OracleProvider.db.set'访问者的辅助功能修饰符必须比属性或索引器'Framework.OracleProvider.db'更具限制性。

我一直在寻找类似的问题,但还没有找到答案。

任何人都可以向我解释为什么会这样吗?我真的很想学习。

2 个答案:

答案 0 :(得分:40)

这是问题所在:

private OdbcConnection db { get; private set; }

假设你真的希望getter和setter都是私有的,那应该是:

private OdbcConnection db { get; set; }

setter 已经 private,因为这是整体属性的可访问性。

或者,如果您希望getter是非私有的并且setter是private的,则需要指定一些其他修饰符,例如

internal OdbcConnection db { get; set; }

基本上,如果您要在属性的get;set;部分指定访问修饰符,则必须比其他方式更具限制性。

来自C#规范的第10.7.2节:

  

accessor-modifier 必须声明一个可访问性,该可访问性比声明的属性或索引器本身的可访问性更严格。确切地说:

     
      
  • 如果属性或索引器的声明可访问性为public,则 accessor-modifier 可以是protected internalinternalprotected ,或private
  •   
  • 如果属性或索引器具有protected internal的声明可访问性,则 accessor-modifier 可以是internalprotected或{{1} }。
  •   
  • 如果属性或索引器具有privateinternal的已声明可访问性,则 accessor-modifier 必须为protected
  •   
  • 如果属性或索引器具有private的声明可访问性,则不能使用 accessor-modifier
  •   

(顺便说一下,如果它对于阅读和写作都是私有的,那么使用一个字段可能会更好。使用属性的大部分好处只有在它超出当前类时才会出现。如果你 do 将其保留为属性,请考虑将其重命名为遵循正常的.NET命名约定。)

答案 1 :(得分:6)

嗯,错误告诉所有所需的信息

  

辅助功能修饰符...访问者必须比属性更具限制性...

  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
  }