【问题标题】:Compiler inconsistent accessibility error with passing nested class as a function parameter编译器不一致的可访问性错误,将嵌套类作为函数参数传递
【发布时间】:2013-10-18 05:46:15
【问题描述】:

当我编译此 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 确实解决了我的问题。现在,感谢答案和 cmets,我明白这是因为 public Function1 比内部(默认情况下)BaseClass 具有更大的可访问性。但是我不明白为什么我可以毫无错误地创建新的 NestedClass 对象?

【问题讨论】:

  • BaseClass 默认为private。在BaseClass 之外无法访问NestedClass,因为BaseClass 是私有的。将BaseClass 更改为public

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


【解决方案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 节。

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

【讨论】:

  • 谢谢!实际上?我只是尝试将这个问题从我的项目中放入控制台应用程序中,并且在嵌套类型中没有嵌套类型。我只是觉得很奇怪我可以创建嵌套类型类的新对象并且不能将其作为参数传递
  • @user2893207:我很困惑——你肯定在你的问题中有一个双重嵌套类型。您是说这不在您的真实代码中吗?当有两套代码要讨论时,讨论事情变得非常困难。
  • 抱歉,我现在编辑了问题。当我在项目中遇到该问题时,我尝试在控制台应用程序中重新创建它然后发布。
【解决方案2】:

他们有不同的访问级别。您必须将 BaseClass 声明为 public 或 internal。

public class BaseClass
    {
        public class NestedClass
        {

        }
    }

【讨论】:

  • 不需要公开。它可能是内部的。它只需要具有至少与引用它的方法一样大的可访问域。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-03
  • 1970-01-01
  • 2021-11-09
  • 2015-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多