访问者必须比财产或索引器更具限制性
我有以下课程:
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 internal
,internal
,protected
或private
。- 如果属性或索引器具有已声明的
protected internal
可访问性,则accessor-modifier可以是internal
,protected
或private
。- 如果属性或索引器具有已声明的
internal
或protected
可访问性,则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 }