我正在阅读 Joseph Albabari 和 Ben Albabari 所著的“C# 4.0 in a nutshell”一书。从那里我找到了关于访问修饰符的主题限制。第 91 页,主题“访问修饰符的限制”。
引自书中。
编译器防止任何不一致的访问修饰符使用。例如,子类本身可能比基类更难访问,但不会更多
所以这说明基类应该比子类更容易访问。因此,如果基类是内部的,那么子类应该是私有的或内部的。如果基类是私有的,子类是公有的,则会产生编译时错误。在 Visual Studio 中尝试此操作时,我发现了一些奇怪的行为。
尝试1:基类是私有的,子类是私有的(有效,正确的行为)如果两者都是内部的,公共的,这也有效。
private class A { }
private class B : A { } // Works
尝试 2:基础是私有的,子类是公共的或内部的(这失败了,正确的行为)
private class A { }
public class B : A { } // Error
尝试 3:Base 是内部的并且 sub 是公共的(这可行,但它应该失败。因为 Base 比子类更难访问
internal class A { }
public class B : A { } // Works, but why
现在我的问题是为什么 Try 3 没有失败?子类是公共的,比内部的基类更容易访问。甚至书中说这应该失败。但是 Visual Studio 成功编译了这个。这应该有效吗?
编辑:
我在 VS 中创建了一个新的控制台项目。在 Program.cs 我添加了我的代码。这是 Program.cs 文件的完整代码。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace ConsoleApplication
{
class Program
{
internal class A { }
public class B : A { } // Error
static void Main()
{
}
}
}