为什么编译器无法弄清楚这一点?(属性)

本文关键字:属性 这一点 弄清楚 编译器 为什么 | 更新日期: 2024-11-08 08:13:49

在使用可变结构和属性时,编译器可以弄清楚一些事情,但不能对其他相当明显的事情做同样的事情,这对我来说似乎很奇怪。

以以下自动属性为例:

Vector2 Vector { get; set; }

而不是键入以下内容:

Vector2 v = Vector;
v += new Vector2(5, 7);
Vector = v;

编译器足够聪明,可以让我这样做:(结构的可变性在这里没有影响)

Vector += new Vector2(5, 7);

但是编译器似乎不够聪明,即使我可以访问setter和getter,也不允许我执行以下操作 -

Vector.X += 4;

相反,我被迫"手动"执行此操作 -

Vector2 v = Vector;
v.X += 4;
Vector = v;

编译器团队决定允许第一种速记形式而不是第二种速记形式有什么特别的原因吗?
除了建议的方式显然更简洁之外,我还认为它可以潜在地为 NGEN/JIT 提供更有效的内联,因为很明显,getter 生成的副本不会在其他任何地方使用。(仅当这可以以某种方式反映在 IL 代码中时)

为什么编译器无法弄清楚这一点?(属性)

如果Vector2是结构(值类型),则分配给someObject.Vector.X将分配给Vector属性返回的临时副本。这永远没有意义,因此是不允许的。

请参阅为什么可变结构是"邪恶的"?以获取一般参考和一些链接。

这不是编译器足够聪明的问题,而是代码编译成什么的问题。

Vector += new Vector2(5, 7);

编译为

Vector = Vector + new vector2(5,7);

所以我们有一个任务。 都很好。

Vector.X += 2;

编译为

var v = Vector;
v.X = v.X + 2

没有分配回Vector