这对我编译很好 - 但是不同线程上的其他人都说无法在顶级c#中声明受保护的类
是这样的吗?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
protected class CsvReader
{
}
}
答案 0 :(得分:6)
对于我来说,无法使用VS2008SP1或VS2010进行编译(在两种情况下都使用命令行中的csc.exe)。
您使用的是哪种编译器?
来自C#规范的第3.5.1节:
- 以编译单位声明的类型 或命名空间可以有
public
或internal
声明了可访问性和 默认为internal
声明 可访问性。- 班级成员可以 有五种声明中的任何一种 可访问性和默认为
private
声明可访问性。 (注意一个 声明为类成员的类型 可以有五种中的任何一种 声明可访问性,而类型 声明为命名空间的成员 只能public
或internal
声明可访问性。)
答案 1 :(得分:4)
考虑:顶级课程中protected
甚至意味着什么。在类成员上,这意味着派生类可以访问该成员。但是没有派生命名空间这样的东西,那么protected
甚至会引用什么?
答案 2 :(得分:1)
我不知道它是否编译,但问问自己:这意味着什么? 似乎表示只能从CsvReader
命名空间,或任何派生的命名空间(?)中访问ConsoleApplication1
;但显然这是无稽之谈。这就是为什么规范中不允许这样做的原因。 (至少那将是我的解释。)
答案 3 :(得分:0)
由于没有代码能够访问它,所以不能将类声明为顶级保护(除非继承,否则应使用抽象类)。为什么要创建无法访问的代码?