2011-01-27 7 views
15

Witam Mam problem z ustaleniem tego. Mam te struktury i klasy.Dostęp do właściwości, indeksowania lub dostępu dynamicznego nie może być przekazywany jako parametr wyjściowy lub ref.

struct Circle 
{ ... } 

class Painting 
{ 
    List<Circle> circles; 

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

Próbuję zmodyfikować jeden z kręgów wewnątrz klasy malarstwa poza nią, przy użyciu tego kodu:

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

Linia ta daje mi błąd kompilatora:

A property, indexer or dynamic member access may not be passed as an out or ref parameter

Dlaczego tak jest i co mogę zrobić, aby rozwiązać ten problem, nie zmieniając zbytnio mojego kodu?

+2

BTW - Lubię alias (CantMutate), nawet jeśli jest to oczywiście jednorazowa na to pytanie;) –

+0

Dzięki, może będę trzymać go za każdym razem, gdy mam zakładać tu :) – CantMutate

Odpowiedz

33

Błąd jest całkiem jasny - nie można przekazać właściwości do parametru ref metody.

Musisz zrobić tymczasowy:

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

Mając na uwadze powyższe, Zmienne struktury są często zły pomysł. Możesz rozważyć utworzenie tej klasy zamiast struktury.

+0

Tylko pytanie, dlaczego dostęp do struct tak jak ja liczy się jako dostęp do nieruchomości? Rozumiem, że mam dostęp do samej listy. – CantMutate

+0

@CantMutate: Ty * masz * dostęp do właściwości: 'ref painting.Circles [mutationIndex]'. Korzysta z indeksu (który jest rodzajem własności) po pobraniu listy za pośrednictwem właściwości. –

+1

@Jon Skeet: Dzięki, może nadszedł czas, aby wrócić do książki C#! – CantMutate

2

Jeśli istnieje tylko jeden parametr ref i typ zwrotu dla MutatePosition, możesz zwrócić wartość.

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

Jeśli istnieje wiele par parametrów i/lub już typ zwracany, można utworzyć nowy typ zawierający wszystkie elementy, które należy zwrócić.

class MutateResults() { Circle Circle; object OtherReffedStuff; } 
Powiązane problemy