我遇到了想要一个属性拥有内部getter和受保护的setter的问题,如this question中所述,我认为通过执行以下操作解决了这个问题:
public class Accessor : AccessorBase
{
private Connection _connection;
protected void setConnection(Connection value)
{
_connection = value;
}
internal Connection GetConnection()
{
return _connection;
}
...
}
但是,我现在收到此错误:
可访问性不一致:参数类型“连接”比方法“setConnection(连接)”更难访问
这是因为我有internal class Connection
。我宁愿不让Connection
成为公共类,而Accessor
需要是公开的,那么如何在保持内部getter和受保护的setter的同时解决这个错误?
答案 0 :(得分:9)
不幸的是,C#不支持“内部和受保护”访问修饰符(仅支持“内部或受保护”),这意味着任何{{1成员在程序集外部可见,不能使用内部类型
使用 protected
代替internal
将是最合理的解决方案。
你可以vote at Microsoft Connect以便它可能会在某一天被添加到C#中。
更新:从C#7.2起,您可以使用private protected
。
答案 1 :(得分:5)
创建内部IConnection
对象实现的公共接口Connection
。让您的GetConnection
和SetConnection
方法接受并返回IConnection
而不是Connection
。
基本SOLID原则再次获胜。
答案 2 :(得分:2)
......任何受保护的成员都可见 在组装之外,不能使用 内部类型。
解决这个问题的一种方法是使Connection
公开,同时使其所有实例方法和构造函数都在内部。
答案 3 :(得分:1)
如果类Connection是内部的,则派生Accessor的类将无法调用受保护的setConnection,因为它无权访问Connection。
如果要保护setConnection,则必须公开Connection。
答案 4 :(得分:0)
抱歉,如果您需要准确的设置,则需要公开Connection
课程。
答案 5 :(得分:0)
你不能那样做。由于Connection
是内部的,因此来自另一个程序集的Accessor的某个类将无法看到Connection
,即使您将setter标记为protected internal
它也不会解决任何问题。
你唯一的希望就是让班级公开。
答案 6 :(得分:0)
Coincoin is correct,Accessor
是任何人都可以从中派生的公共类,这也意味着来自不同的程序集。该派生类现在具有需要传递内部(来自另一个程序集)类的受保护方法。这永远不会奏效。
您需要将Accessor
内部公开或Connection
公开,或者更好地关注Randolphos answer
以下是问题的代码示例
装配1
//this class is only visible in Assembly 1
internal class Connection
{
}
public class Accessor
{
protected void SetConnection(Connection con) { }
}
装配2 - 参考装配1
//possible because Accessor is public
DerivedAccessor : Accessor
{
void SomeMethod()
{
this.SetConnection(????) // you can't pass Connection, its not visible to Assembly2
}
}