在C#中,为什么静态字段的初始化器中允许循环依赖?

时间:2018-02-16 00:25:29

标签: c#

对于静态字段,循环依赖关系会产生默认值。

static int a = b; // 0
static int b = a; // 0

它不适用于实例字段,因为它们不能互相引用。

int c = d; // CS0236 A field initializer cannot reference the non-static field, method, or property
int d = c; // CS0236

为什么允许静态字段?

2 个答案:

答案 0 :(得分:3)

它不是循环依赖,而是静态和实例字段初始化的区别。

  

实例字段的变量初始值设定项无法引用   正在创建的实例。因此,引用是编译时错误   这在一个变量初始化程序中,因为它是一个编译时错误   一个变量初始化程序,通过一个引用任何实例成员   简单名称

简而言之,您无法在创建实例变量之前对其进行引用。

答案 1 :(得分:1)

更新:我用+4票看到了这个问题。从来没有想过这是一个如此简单的问题。我误解了这个问题,但我认为我的答案仍然有用,所以我不打算删除它。

这不是循环依赖问题。为什么允许第一个例子?请考虑一下:

在方法中,这没关系:

int a;
int b;
a = b;
b = a;

但不允许这样做:

int c;
c = d;
int d;
d = c;

类中字段/方法的声明的顺序并不重要(但 definitions 有顺序)