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" の戻り値を変更できません」
私はエラーをグーグルで調べてみましたが、私がしたようにこれを行った人は誰もいないと思います (これはかなり興味深いケースだと思いますが、おそらく本当に醜いです)。この問題を解決する正しい方法は何でしょうか? このようにインデックス演算子を使用するのは間違っていますか?
注: はい、これが変更可能な構造体であることはわかっています。繰り返しますが、既存のコード