我有以下课程:
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'更具限制性。
我一直在寻找类似的问题,但还没有找到答案。
任何人都可以向我解释为什么会这样吗?我真的很想学习。
答案 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 internal
,internal
,protected
,或private
。- 如果属性或索引器具有
protected internal
的声明可访问性,则 accessor-modifier 可以是internal
,protected
或{{1} }。- 如果属性或索引器具有
private
或internal
的已声明可访问性,则 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
}