访问自动属性结构的索引运算符

时间:2013-11-06 02:04:36

标签: c# struct operator-overloading automatic-properties

我有一个“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“的返回值,因为它不是变量”

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

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

1 个答案:

答案 0 :(得分: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);
        }
    
  4. 我个人会去找nbr。 3作为可变结构(如你所见)是a **中的痛苦。