2012-08-01 17 views
5

Mientras trato de cambiar el tamaño de una matriz en C# como abajo,una propiedad o indizador no se pueden pasar como out o ref parámetro mientras Matriz Cambiar el tamaño de

Array.Resize(ref Globals.NameList, 0); 

me sale el error abajo

A property or indexer may not be passed as an out or ref parameter 

Globals es un objeto. NameList es una matriz de tipo de cadena declarada en la clase Globals.

Por favor, ayúdame a solucionar esto publicando el código correcto.

Gracias!

+0

Sólo una mayor información. Se produce el mismo error cuando utilizamos una propiedad como parámetro out en int.TryParse(). En este caso también necesitamos una variable intermedia para hacer la operación. Luego asigne el valor de la variable a la propiedad. – Narendra

Respuesta

18

variable de uso, pero no la propiedad

var obj = Globals.NameList; 
Array.Resize(ref obj , 0); 
Globals.NameList=obj; 
+1

Correcto, pero como el nuevo tamaño es '0', es un poco exagerado. –

+0

Gracias burning_LEGION .. Eso lo solucionó :) – codebug

8

El error del compilador habla por sí mismo - no se puede pasar una propiedad por referencia; solo una variable

Desde la sección de especificaciones C# 10.6.1.2:

Cuando un parámetro formal es un parámetro de referencia, el argumento correspondiente en una invocación de método debe constar de la palabra clave ref seguido de un variable de referencia (sección 5.3.3) del mismo tipo que el parámetro formal.

Una expresión acceso a la propiedad no cuenta como una variable de referencia .

es probable que desee:

var tmp = Globals.NameList; 
Array.Reize(ref tmp, 0); 
Globals.NameList = tmp; 

Tenga en cuenta que hace VB permiten pasar de una propiedad por referencia, sino que actúa como el de arriba. En particular, cada asignación dentro del método solo afectará un valor temporal, en lugar de ser una llamada al colocador correspondiente.

También tenga en cuenta que el tener una clase llamada Globals con propiedades públicas mutables es un olor diseño ...

+0

Gracias Jon Skeet. En caso de que este no sea un buen enfoque, si necesito agrupar algunas variables globales y objetos que deberían estar disponibles para toda la aplicación, ¿cuál debería ser la mejor práctica? – codebug

+0

Jon Skeet .. No puedo aceptar publicaciones múltiples como respuesta? Quería aceptar tu comentario también como una respuesta. Actualmente no puedo votar tu publicación en mi nivel :) – codebug

+1

@codebug: solo puedes aceptar una publicación, sí. Acepte lo que sea más útil para usted. En cuanto al diseño, trate de evitar * la necesidad * de "objetos que deban ser accesibles para toda la aplicación". Examine el uso de la inyección de dependencia para permitir que cada clase exprese lo que necesita. –

0

hacer

Array arr = Globals.NameList; 
Array.Resize(ref arr, 0); 
Globals.NameList = arr; 
Cuestiones relacionadas