2011-01-27 26 views
15

Hola, estoy teniendo problemas para resolver esto. Tengo estas estructuras y clases.Una propiedad, indexador o acceso de miembro dinámico no se puede pasar como un parámetro de salida o referencia

struct Circle 
{ ... } 

class Painting 
{ 
    List<Circle> circles; 

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

estoy tratando de modificar uno de los círculos dentro de la clase de pintura desde fuera de ella, utilizando este código:

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

Esta línea es que me da un error del compilador:

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

¿Por qué es esto y qué puedo hacer para solucionarlo sin cambiar demasiado mi código?

+2

BTW - Me gusta su alias (CantMutate), incluso si es obviamente una sola vez para esta pregunta;) –

+0

Gracias, tal vez lo guardaré para cuando he puesto aquí :) Sólo un – CantMutate

Respuesta

33

El error es bastante claro: no se puede pasar una propiedad a un parámetro de referencia de un método.

Usted necesita hacer una temporal:

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

Dicho esto, estructuras mutables son a menudo una mala idea. Es posible que desee considerar hacer de esto una clase en lugar de una estructura.

+0

pregunta, ¿por qué el acceso a la estructura como lo estaba haciendo cuenta como el acceso a una propiedad? Pude entender si estaba accediendo a la lista en sí. – CantMutate

+0

@CantMutate: Usted * está * accediendo a la propiedad: 'ref painting.Circles [mutationIndex]'. Eso es usando un indexador (que es un tipo de propiedad) después de obtener la lista a través de una propiedad. –

+1

@Jon Skeet: ¡Gracias, tal vez es hora de volver al libro de C#! – CantMutate

2

Si solo hay un parámetro de referencia y ningún tipo de devolución para MutatePosition, puede devolver el valor.

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

Si hay múltiples árbitro params y/o ya un tipo de retorno se puede crear un nuevo tipo que incluye todo lo que tiene que ser devuelto.

class MutateResults() { Circle Circle; object OtherReffedStuff; } 
Cuestiones relacionadas