当我编译这个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但不能是参数?
编辑:对不起,我的问题不太准确。上面我尝试在Console应用程序中重新创建问题,但在我的项目中我有其他类的结构: class BaseClass
{
public class NestedClass
{
}
}
public class OtherClass
{
public void Function1(BaseClass.NestedClass param)
{
var newObj = new BaseClass.NestedClass();
}
}
PS:将BaseClass设置为public真的解决了我的问题。现在,感谢答案和评论,我理解这是因为公共Function1具有比内部(默认情况下)BaseClass更大的可访问性。但我不明白为什么我可以创建新的NestedClass对象而没有错误?
答案 0 :(得分:3)
顶级类型默认为内部类型,但嵌套类型默认为私有类型。因此,您有一个内部类型,其中包含一个私有类型作为参数的公共方法。使所有访问修饰符显式:
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节。
就个人而言,我会避免过多地使用嵌套类 - 当你在嵌套类型中有嵌套类型时,我会强烈考虑重新设计。
答案 1 :(得分:1)
他们有不同的访问级别。您必须公开或内部声明您的BaseClass。
public class BaseClass
{
public class NestedClass
{
}
}