与通过嵌套类作为函数参数不一致编译错误无障碍(Compiler inconsistent acces

2019-10-29 03:10发布

我的Visual Studio 2010中找到参数类型错误的可访问性不一致,当我编译此C#代码:

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

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

编辑:对不起,我是不是我的问题相当精确。 上面我试图重新在控制台应用程序的问题,但在我的项目,我有类等结构:

         class BaseClass
            {
               public class NestedClass
                {

                }
            }

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

PS:设置BaseClass的公共真正解决我的问题。 现在,由于答案和意见,我明白,这是因为公共功能1比内部(默认)BaseClass的更大的便利。 但我不明白为什么我没有错误创建新NestedClass对象?

Answer 1:

顶级类型默认为是内部的,但嵌套类型被默认为私有。 因此,您已经有了一个内部类与具有专用类型作为参数的公共方法。 使所有的访问修饰符明确:

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。

个人而言,我会尽量避免使用嵌套类太重-和你的时间有一个嵌套类型中嵌套类型,我会认真考虑重新设计。



Answer 2:

他们有不同的访问级别。 你必须声明你BaseClass的公开或内部。

public class BaseClass
    {
        public class NestedClass
        {

        }
    }


文章来源: Compiler inconsistent accessibility error with passing nested class as a function parameter