在C#5.0语言规范中,它表示:
请注意,常量和嵌套类型被归类为静态成员。
所以如果我写:
class A
{
int a;
class B
{
public void foo()
{
int j = a; // ERROR
}
}
}
分配给j给我CS0120错误
“非静态字段,方法或属性“成员”需要对象引用”
所以我可以理解这也是foo
隐式静态的。
但是,当我同时查看反编译代码和IL代码时,并没有显示static关键字!
internal class A
{
private class B
{
public void foo()
{
}
}
private int a;
}
// Nested Types
.class nested private auto ansi beforefieldinit B
extends [mscorlib]System.Object
{
// Methods
.method public hidebysig
instance void foo () cil managed
{
}
...
}
嵌套类型真的是所有类型的方法都隐式静态的静态类型吗?
嵌套类型真的是所有类型的方法都隐式静态的静态类型吗?
否-类型的定义是静态成员,但是类型本身不是静态的。
当它说
请注意,常量和嵌套类型被归类为静态成员。
这意味着您可以创建嵌套类的实例而无需父类的实例。
换句话说,用代码
public class Parent
{
public class Child
{
}
}
呼叫new Parent.Child()
,您无需先通话new Parent()
或类似操作。
您的实际问题是嵌套类型的实例与父类型的实例是分开的-您的代码,
class A
{
int a;
class B
{
public void foo()
{
int j = a; // ERROR
}
}
}
不编译因为在A.B.foo()
中,场a
是一个实例(即不是静态)部件的A
,并B
没有实例的A
引用。
您可以将类型嵌套视为扩展父级中私有成员对孩子的可访问性的一种方式,例如
public class Parent
{
private int field;
public class Child
{
public void WriteFieldFromParent(Parent parent)
{
Console.WriteLine(parent.field);
}
}
}
编译!你可以得到的值私人领域field
中Parent
从Parent.Child
因为它的嵌套类。请注意,我需要将的实例传递Parent
给Parent.Child.WriteFieldFromParent
。
实际上,关于嵌套类型的MSDN页面(我不知道为什么在初次编写此答案时没有引用它)给出了类似于我的示例,并说:
嵌套类型可以访问其包含类型可以访问的所有成员。它可以访问包含类型的私有成员和受保护成员,包括任何继承的受保护成员。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句