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

本文关键字:嵌套 参数传递 函数 不一致 访问 错误 编译器 | 更新日期: 2023-09-27 18:35:49

>当我编译此 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();
    }
}

但是当我评论函数1时,它可以工作。

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();
    }
}

为什么可以创建嵌套类,但不能成为参数?

编辑:对不起,我的问题不太准确。上面我试图在控制台应用程序中重现问题,但在我的项目中,我还有其他类结构:

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

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

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

顶级类型默认为内部类型,但嵌套类型默认为私有类型。因此,您有一个内部类型,其中包含一个将私有类型作为参数的公共方法。显式执行所有访问修饰符:

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设为内部或公共Function1私有来解决此问题。请注意,BaseClass不必仅仅因为Function1是公共的,因为Program辅助功能域只是包含它的程序集。这使得Function1的可访问性域相同。有关更多详细信息,请参阅 C# 规范的第 3.5.2 节。

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

它们具有不同的访问级别。您必须声明您的 BaseClass 是公共的或内部的。

public class BaseClass
    {
        public class NestedClass
        {
        }
    }