【发布时间】:2013-05-15 00:46:31
【问题描述】:
我正在阅读 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()
{
}
}
}
【问题讨论】:
-
从技术上讲,
internal可以通过InternalsVisibleTo attribute 在程序集外部使用,所以这可能就是它背后的原因。我会看看能否在 C# 规范中找到特定的条目。 -
为我尝试 3 个作品,即。无法编译,出现不一致的可访问性错误。
-
我也想到了 InternalsVisibleTo 属性,但是如果我在我的程序集文件中没有提到这个怎么办。这肯定有其他原因。
-
附带说明,这个问题可以作为教科书示例,说明为什么 Jon Skeet 总是强调您应该在问题中包含一个“简短但完整”程序。一旦问题被编辑,问题就很明显了。在此之前,一个谜:-)
-
这里有一个谜题,看看你是否理解规则。
public class Alpha { protected internal class Bravo {} }在程序集 Alpha.DLL 中,public class Charlie : Alpha { xxx class Delta : Bravo {} }在程序集 Charlie.DLL 中。可访问性修饰符xxx的合法值是什么?
标签: c# inheritance base-class