相关疑难解决方法(0)

C#类和成员(字段,方法等)的默认可见性?

我正在尝试找到C#各个方面的默认可见性的参考.类类型,字段,方法,枚举等

有人可以提供这些列表以及它们的默认可见性(即没有前缀修饰符)吗?

c#

152
推荐指数
3
解决办法
10万
查看次数

可访问性不一致:基类比子类更难访问

我正在读约瑟夫·阿尔巴巴里和本·阿尔巴巴里的书"简而言之的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)

c# inheritance base-class

7
推荐指数
1
解决办法
9429
查看次数

CS0060的起源是什么:类类型的直接基类必须至少与类类型本身一样可访问

我刚刚在.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)

谢谢

.net c# language-specifications

-1
推荐指数
1
解决办法
581
查看次数