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

我有以下课程:

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 已经private ,因为这是整个属性的可访问性。

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

 internal OdbcConnection db { get; set; } 

基本上,如果你要在get;上指定一个访问修饰符get;set; 作为财产的一部分,它必须比其他情况更具限制性。

从C#规范的第10.7.2节:

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

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

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

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

accessibility modifier … 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 }