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

Mar*_*sen 27 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+";");    
        }        
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我收到以下错误:

错误11:'Framework.OracleProvider.db.set'访问器的可访问性修饰符必须比属性或索引器'Framework.OracleProvider.db'更具限制性

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

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

Jon*_*eet 43

这就是问题:

private OdbcConnection db { get; private set; }
Run Code Online (Sandbox Code Playgroud)

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

private OdbcConnection db { get; set; }
Run Code Online (Sandbox Code Playgroud)

因为这是整体财产的可访问性,所以已经 是二传手private.

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

internal OdbcConnection db { get; set; }
Run Code Online (Sandbox Code Playgroud)

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

从C#规范的第10.7.2节:

访问修饰符必须声明的可访问性是严格大于属性或索引本身的声明可访问更多的限制.确切地说:

  • 如果属性或索引器的声明可访问public时,访问修饰符可以是protected internal,internal,protected,或private.
  • 如果属性或索引器的声明可访问protected internal时,访问修饰符可以是internal,protectedprivate.
  • 如果属性或索引器具有声明的internalor的可访问性protected,则accessor-modifier必须是private.
  • 如果属性或索引器具有声明的可访问性private,则不能使用accessor-modifier.

(顺便说一句,如果是私密的读取和写入,它很可能是只是为了更好地使用领域,大多数的使用属性的好处是只存在,如果它暴露超过当前的类.如果你保持作为属性,请考虑将其重命名为遵循正常的.NET命名约定.)


Dmi*_*nko 6

好吧,错误告诉所需的所有信息:

accessibility modifier ... accessor必须比属性更具限制性......

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

所以你可以做到

  // 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")
  }
Run Code Online (Sandbox Code Playgroud)

要么

  private OdbcConnection db { 
    get; 
    set; // <- just don't declare accessor modifier
  }
Run Code Online (Sandbox Code Playgroud)