我如何使用 属性 来初始化另一个 属性?

How do I use a property to initialize another property?

这是为什么:

public int X { get; } = 5
public int Y { get; } = X;

不可能?

因为手动操作:

public TestClass()
{
  X = 5;
  Y = X;
}

有效,而且(显然?)这个:

public static int X { get; } = 5;
public static int Y { get; } = X;

有没有办法编译第一个示例,还是我必须在 ctor 中手动完成?

(我真正的问题要复杂得多,不仅仅是整数,还有实例然后被用来创建其他实例,但是这个例子更容易讨论)

之所以不可能,是因为这些初始化是在调用构造函数之前完成的。所以它发生在 static 上下文中。该对象尚未完全初始化,还没有 this 引用。所以你不能访问像 X.

这样的 non-static 属性

出于同样的原因,它适用于第三个示例中的 static 属性。

所以我没有看到解决方法,而是在构造函数中进行这种初始化。

您不能在 属性 Y 的初始化表达式中使用非静态 属性 X 的值,原因与您不能使用该值的原因相同字段 y 的初始化表达式中的非静态字段 x,即

public int x = 5;
public int y = x; // Not allowed

这会触发 error CS0236,因为允许编译器决定它处理字段和 属性 部分 class 的初始值设定项的顺序。虽然当两个属性都在同一个文件中定义时 X 保证在 Y 之前初始化,但是对于包含部分 class 代码的不同文件中定义的属性没有这样的保证.

编译器设计者可以通过允许初始化程序引用在字段或 属性 初始化之前定义的其他字段和属性来实现它,但是这个功能不值得麻烦,因为您可以轻松地解决它将初始化移动到构造函数中。

在构造函数中执行相同的操作不会出现问题,因为您可以控制赋值的顺序。当您在构造函数中说 X 必须在 Y 之前初始化时,编译器不允许更改该顺序。