0

我有一个存储 ax、y 和 z 值的“Vector”结构。为了使它们更易于访问,我添加了一个索引运算符,如下所示:

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,但我正在使用预先存在的代码,此时很难重构。

现在,如果我在类中使用结构作为自动属性,然后尝试修改它的 xyz 值,我会得到这个

public Vector v{ get; set; }
void funct(){
    for(int i = 0; i < 3; i++)
    {
        v[i] = 3.0;
    }
}

我得到一个编译器错误:

“无法修改“v”的返回值,因为它不是变量”

我已经尝试在谷歌上搜索错误,但我认为没有人像我一样这样做(我猜这是一个非常有趣的案例,而且可能真的很丑)。解决这个问题的正确方法是什么?像这样使用索引运算符有错吗?

注意:是的,我知道这是一个可变结构。再次,预先存在的代码

4

1 回答 1

2

你有一些选择:

  1. 把它变成一个class而不是一个struct
  2. 先获取struct值的副本,修改,然后放回去:

    Vector temp = v;
    for(int i = 0; i < 3; i++)
    {
        temp[i] = 3.0;
    }
    v = temp;
    
  3. 使其不可变并添加辅助/工厂方法:

    public struct Vector
    {
        ....
    
        public Vector WithX(double x)
        {
            return new Vector(x, this.y, this.z);
        }
    

我个人会去nbr。3 作为可变结构(如您所见)是 a** 中的一个痛苦。

于 2013-11-06T12:30:42.717 回答