web-dev-qa-db-ja.com

プロパティ、インデクサー、または動的メンバーアクセスは、outまたはrefパラメーターとして渡されない場合があります

こんにちは私はこれを理解するのに苦労しています。私はこれらの構造体とクラスを持っています。

struct Circle
{ ... }

class Painting
{
     List<Circle> circles;

     public List<Circle> circles
     {
          get { return circles; }
     }
}

次のコードを使用して、paintingクラス内の円の1つをその外側から変更しようとしています。

MutatePosition(ref painting.Circles[mutationIndex], painting.Width, painting.Height);

この行は私にコンパイラエラーを与えています:

プロパティ、インデクサー、または動的メンバーアクセスは、outまたはrefパラメーターとして渡されない場合があります

これはなぜですか。コードをあまり変更せずに解決するにはどうすればよいですか。

15
CantMutate

エラーは非常に明白です-メソッドのrefパラメーターにプロパティを渡すことはできません。

あなたは一時的なものを作る必要があります:

var circle = painting.Circles[mutationIndex];
MutatePosition(ref circle, painting.Width, painting.Height);
painting.Circles[mutationIndex] = circle;

そうは言っても、可変構造体はしばしば悪い考えです。これを構造体ではなくクラスにすることを検討することをお勧めします。

33
Reed Copsey

Ref paramが1つだけで、MutatePositionの戻り値の型がない場合は、値を返すことができます。

painting.Circles[mutationIndex] = MutatePosition(circle, painting.Width, painting.Height);

複数のrefパラメータがある場合や、すでに戻り値の型がある場合は、返す必要のあるすべてのものを含む新しい型を作成できます。

class MutateResults() { Circle Circle; object OtherReffedStuff; }
2
ShawnFeatherly