我有一个“Vector”结构,它存储x,y和z值。为了使它们更容易访问,我添加了一个索引操作符,如下所示:
public struct Vector
{
public double x;
public double y;
public double z;
public double this[int i]
{
get
{
if(i == 0) return x;
else if(i == 1) return y;
else if(i == 2) return z;
else throw new ArgumentOutOfRangeException("i", i, "Index must be 0, 1, or 2");
}
set
{
if (i == 0) x = value;
else if (i == 1) y = value;
else if (i == 2) z = value;
else throw new ArgumentOutOfRangeException("i", i, "Index must be 0, 1, or 2");
}
}
}
注意:通常我会使用数组而不是x,y,z,但我正在使用预先存在的代码,此时很难重构。
现在,如果我在一个类中使用struct作为auto-property,然后尝试修改其xyz值,我就明白了
public Vector v{ get; set; }
void funct(){
for(int i = 0; i < 3; i++)
{
v[i] = 3.0;
}
}
我收到编译错误:
“无法修改”v“的返回值,因为它不是变量”
我已经尝试使用谷歌搜索错误,但我认为没有人像我一样这样做(这是一个非常有趣的案例,我猜,可能真的很难看)。什么是解决这个问题的正确方法?使用像这样的索引运算符是错误的吗?
注意:是的,我知道这是一个可变的结构。同样,预先存在的代码
答案 0 :(得分:2)
你有一些选择:
class
而不是struct
首先获取struct值的副本,修改它,然后将其放回:
Vector temp = v;
for(int i = 0; i < 3; i++)
{
temp[i] = 3.0;
}
v = temp;
使其不可变并添加帮助/工厂方法:
public struct Vector
{
....
public Vector WithX(double x)
{
return new Vector(x, this.y, this.z);
}
我个人会去找nbr。 3作为可变结构(如你所见)是a **中的痛苦。