gpt4 book ai didi

c# - 为什么编译器不能解决这个问题? (特性)

转载 作者:行者123 更新时间:2023-11-30 21:05:10 30 4
gpt4 key购买 nike

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

以下面的自动属性为例:

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 生成的副本不会在其他任何地方使用。 (仅当这可以以某种方式反射(reflect)在 IL 代码中时)

最佳答案

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

参见 Why are mutable structs “evil”?用于一般引用和一些链接。

关于c# - 为什么编译器不能解决这个问题? (特性),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11853843/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com