我正在尝试找到C#各个方面的默认可见性的参考.类类型,字段,方法,枚举等
有人可以提供这些列表以及它们的默认可见性(即没有前缀修饰符)吗?
我正在读约瑟夫·阿尔巴巴里和本·阿尔巴巴里的书"简而言之的C#4.0".从那里我发现访问修饰符的主题限制.第91页,主题"访问修饰符的限制".
从书中引用.
编译器会阻止任何不一致的访问修饰符的使用.例如,子类本身可以比基类更难访问,但不能更多
所以这说明基类应该与子类相同或更易于访问.因此,如果基类是内部的,那么子类应该是私有的或内部的.如果基类是私有的,而子类是公共的,那么将生成编译时错误.在Visual Studio中尝试这个时,我发现了一些奇怪的行为.
尝试1:Base是私有的,子类是私有的(Works,正确的行为)如果两者都是内部的,那么它也有效.
private class A { }
private class B : A { } // Works
Run Code Online (Sandbox Code Playgroud)
尝试2:Base是私有的,子类是public或internal(这是失败的,正确的行为)
private class A { }
public class B : A { } // Error
Run Code Online (Sandbox Code Playgroud)
尝试3:Base是内部的,sub是公共的(这是有效的,但它应该失败.因为Base比子类更难访问
internal class A { }
public class B : A { } // Works, but why
Run Code Online (Sandbox Code Playgroud)
现在我的问题是为什么试试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 …Run Code Online (Sandbox Code Playgroud) 我刚刚在.net中遇到了关于继承的这个基本规则:
CS0060:类类型的直接基类必须至少与类类型本身一样可访问
我很好奇为什么要制定这条规则.
有谁知道为什么这种继承是首选?是否有任何语言以不同的方式执行.
// CS0060.cs
class MyClass
// try the following line instead
// public class MyClass
{
}
public class MyClass2 : MyClass // CS0060
{
public static void Main()
{
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢