我尝试将一个类设为私有并获得此错误“在命名空间中定义的元素不能显式声明为私有,受保护或受保护的内部”
我明白了,但我想问为什么不允许这样做?所有访问修改是否都不适用于Class?为什么我不能将课程设为私人,受保护或受保护的内部?
答案 0 :(得分:72)
因为private表示该成员仅在包含类中可见。由于顶级类没有包含它的类,因此它不能是私有的(或受保护的)。 (但内部或公共是有效的修饰符)。
你希望私人在顶级课程中意味着什么?
当然,所有修饰符都适用于嵌套类,即在另一个类中定义的类。
答案 1 :(得分:12)
您只能在命名空间级别使用public
或internal
答案 2 :(得分:3)
因为它没有意义。您无法访问在命名空间级别定义的受保护或私有类,只能作为嵌套类。
答案 3 :(得分:3)
As Abatonime said,您只能在命名空间级别使用public class CustomHttpSessionStrategy extends CookieHttpSessionStrategy {
@Override
public void onInvalidateSession(HttpServletRequest request, HttpServletResponse response) {
super.onInvalidateSession(request, response);
response.addHeader("X-Application-Session-Is-New", "true");
}
}
或public
。
internal
,private
或protected
只能在班级使用。
这有效
protected internal
这不会
namespace X
{
class A
{
// class code here
private class B
{
// class code here
}
}
}
答案 4 :(得分:2)
只能将嵌套类声明为私有。 嵌套类只能是公共的或内部的(隐式的没有修饰符)
答案 5 :(得分:1)
我遇到了同样的问题,因为我正在创建一个自定义DLL,并且只希望某些类对使用DLL的应用程序可见。所以我只是完全删除修饰符用于我想要私有的类(在特定的命名空间内)。 DLL中相同名称空间内的其他类仍可访问这些类,但在调用应用程序中未显示在Intellisense中。不需要嵌套类。我能想到的唯一解释是错误消息说不能“明确地”声明私有......它没有暗示任何含义。
namespace SmartCardAuthentication
{
class SmartCardIdentity : IIdentity
{
private string _firstName;
private string _lastName;
private string _middleInitial;
....
}
}
在上面的示例代码中,类“SmartCardIdentity”可用于同一命名空间中的其他类,但在将此类转换为DLL时,无法调用应用程序。我还没有以其他方式测试它(即DLL中不同命名空间中的类的可见性。)。
答案 6 :(得分:0)
顶级类型的默认辅助功能是internal
。
类和结构成员的默认可访问性是private
。
接口和枚举成员唯一可访问的是public
。
默认情况下,某个类是private
,如果您想访问该类,则必须在此之前添加public
。
答案 7 :(得分:0)
定义类时,只有 Public 和 Internal 适用。如果在类默认为 internal 之前未定义访问修饰符。
参考MSDN - [https://msdn.microsoft.com/en-us/library/8fd16xs0(v=vs.90).aspx]
答案 8 :(得分:0)
在现实世界中,我们专注于可见物体 一旦对象可见,我们就讨论对象的范围
现实世界中的示例
如果您在大街上行走,就会看到殖民地的房屋 殖民地有房子。 如果殖民地受到保护,没有人看不到房屋 人们认为没有殖民地就没有房子
在编程中
如果我们将类设为私有/顶级保护 没人知道
它存在于程序集中吗?
如果我不在范围之内,请纠正我