c# - 编译器不一致的可访问性错误,将嵌套类作为函数参数传递

标签 c# visual-studio-2010 compiler-errors

编译此 C# 代码时,我的 Visual Studio 2010 发现参数类型错误的可访问性不一致:

class Program
{
    class BaseClass
    {
        public class NestedClass
        {

        }
    }

    public static bool Function1(BaseClass.NestedClass obj)
    {
        return true;
    }

    static void Main(string[] args)
    {
        Function1(new BaseClass.NestedClass());
        new BaseClass.NestedClass();
        Console.ReadLine();
    }
}

但是当我评论 function1 时,它可以工作。
class Program
{
    class BaseClass
    {
        public class NestedClass
        {

        }
    }

    //public static bool Function1(BaseClass.NestedClass obj)
    //{
    //    return true;
    //}

    static void Main(string[] args)
    {
        //Function1(new BaseClass.NestedClass());
        new BaseClass.NestedClass();
        Console.ReadLine();
    }
}

为什么可以创建 NestedClass 但不能作为参数?

编辑:对不起,我的问题不太准确。上面我尝试在控制台应用程序中重新创建问题,但在我的项目中我有其他类结构:
         class BaseClass
            {
               public class NestedClass
                {

                }
            }

    public class OtherClass
    {
          public void Function1(BaseClass.NestedClass param)    
                {
                  var newObj = new BaseClass.NestedClass();
                }
    }

PS:将 BaseClass 设置为 public 确实解决了我的问题。现在,感谢答案和评论,我明白这是因为 public Function1 比内部(默认情况下)BaseClass 具有更大的可访问性。但我不明白为什么我可以创建新的 NestedClass 对象而不会出错?

最佳答案

顶级类型默认为内部类型,但嵌套类型默认为私有(private)。因此,您获得了一个内部类型,该类型具有一个公共(public)方法,该方法具有一个私有(private)类型作为参数。使所有访问修饰符显式:

internal class Program
{
    private class BaseClass
    {
        public class NestedClass {}
    }

    public static bool Function1(BaseClass.NestedClass obj)
    {
        return true;
    }

    private static void Main(string[] args)
    {
        Function1(new BaseClass.NestedClass());
        new BaseClass.NestedClass();
        Console.ReadLine();
    }
}

这意味着程序集其余部分中的任何代码都可以“看到”Function1但不理解它 - 因此不一致的可访问性错误。

您可以通过设置 BaseClass 来解决此问题。内部或公共(public)或通过制作 Function1私有(private)的。请注意 BaseClass不必仅仅因为 Function1 就公开是公开的,因为 Program 的可访问域只是包含它的程序集。这使得 Function1 的可访问域相同。有关更多详细信息,请参阅 C# 规范的第 3.5.2 节。

就我个人而言,我会避免过多地使用嵌套类——当你在嵌套类型中有嵌套类型时,我会强烈考虑重新设计。

关于c# - 编译器不一致的可访问性错误,将嵌套类作为函数参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19442436/

相关文章:

c# - 将 lambda 表达式作为参数传递给方法?

c# - 将 WCF 服务限制为特定用户帐户的最佳方法

c++ - 添加包含守卫会破坏构建

xcode - 模块中的循环依赖 'CoreFoundation' : CoreFoundation -> SpriteKit -> CoreGraphics -> CoreFoundation

C# - 编译器错误 - 将 int[] 分配给 object[]

c# - 更快的循环方法 ('for' 和 'foreach' )?

c# - 从其他实例化类访问和修改公共(public)静态变量,无需使用 getter 或 setter

c# - 可移植类库是否适用于 .net 3.5?

visual-studio - MS Visual Studio 2010中的编译器错误

c# - ObjectContext ConnectionString Sqlite