C# 访问器必须比属性或索引器更严格

C# 访问器必须比属性或索引器更严格,c#,properties,C#,Properties,我有以下课程: 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

我有以下课程:

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”属性或索引器更严格

我一直在研究类似的问题,但还没有真正找到答案

有人能解释一下为什么会发生这种情况吗?我真的很想学习。

这就是问题所在:

private OdbcConnection db { get; private set; }
假设您确实希望getter和setter都是私有的,那么应该是:

private OdbcConnection db { get; set; }
setter已经是私有的,因为这是整个属性的可访问性

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

internal OdbcConnection db { get; set; }
基本上,如果要在
get
设置属性的一部分,它必须比其他情况下更具限制性

根据C#规范第10.7.2节:

访问器修饰符必须声明比属性或索引器本身声明的可访问性更严格的可访问性。准确地说:

  • 如果属性或索引器的声明可访问性为
    公共
    ,则访问器修饰符可以是
    受保护的内部
    受保护的内部
    受保护的
    私有
  • 如果属性或索引器具有声明的
    受保护内部
    的可访问性,则访问器修饰符可以是
    内部
    受保护
    、或
    私有
  • 如果属性或索引器的声明可访问性为
    内部
    受保护
    ,则访问器修饰符必须为
    专用
  • 如果属性或索引器的声明可访问性为
    private
    ,则不能使用访问器修饰符

(顺便说一下,如果它对于阅读和写作都是私有的,那么最好使用一个字段。使用一个属性的大部分好处只有在它被暴露在当前类之外时才存在。如果你将它保持为一个属性,考虑将它重命名为遵循NET.NET命名约定。)

该错误显示了所需的所有信息:

辅助功能修改器。。。访问器必须比属性更严格


专用ODBC连接数据库{//一种常见的模式是将setter设置为私有,而将getter设置为public/protected,以便使属性为只读,可能值得将其添加到答案中,以便completeness@Charleh:我已经这样做了,举了一个内部getter的例子。是的,我花了大约5分钟的时间发布了我的评论,到那时你已经更新了:)我最初是一名java开发人员,什么是内部的,它与私有的、受保护的和公共的相比如何?@Ecchi-Alex:不,它比
internal
“访问受限于这个程序或从这个类派生的类”限制要少。它是联合,而不是交叉点。(在C#7中可能会有一个新的交叉点修改器组合。)
  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
  }