returns remarks method documentacion description comentarios c# casting ref-parameters

method - remarks c#



Pasar un lanzamiento explícito como un parámetro ref(C#) (4)

No puede hacer eso, primero debe materializar el resultado de convertir su objeto en una variable.

Considere el siguiente código, si lo que pide está permitido:

public void SomeFunction(ref byte[] someBytes) { someBytes = new byte[] { 1, 2, 3 }; } SomeClass someInstance = new SomeClass(); SomeFunction(ref (byte[]) someInstance); // uh-oh, what is "someInstance" now?

¿Por qué el argumento está marcado como "ref"? ¿Qué problema está tratando de resolver aquí?

Tengo una clase que es principalmente una envoltura para una gran variedad y algunas tareas domésticas asociadas. Tengo una función que toma un parámetro ref. Cuando paso una instancia de la clase a la función, quiero que se envíe la matriz.

Consideré moldes explícitos. Digamos que tengo alguna función que tiene un parámetro byte [] ref.

public void SomeFunction(ref byte[] someBytes);

Y que tengo alguna clase con un elenco explícito sobrecargado.

class SomeClass { byte[] someBytes; public static explicit operator byte[](SomeClass someInstance) { return someInstance.someBytes; } }

Ahora quiero llamar a la función con la clase como parámetro

SomeClass someInstance = new SomeClass(); SomeFunction(ref (byte[]) someInstance);

El compilador se queja de que "un argumento ref o out debe ser una variable asignable". No estoy seguro de si estoy fallando en dar masajes al compilador correctamente o si realmente no puedes hacer eso.

Consideré un valor de retorno de Propiedad o función, pero no puede pasarlos por ref (y después de educarme, veo por qué ...)

Prefiero no hacer que la matriz sea un campo público, pero eso satisface al compilador. Supongo que podría simplemente crear una variable local para hacer referencia a la matriz, pero esa es una línea adicional de código antes y después de cada llamada de función ...

EDITAR: podría valer la pena señalar que SomeFunction fue escrita por un tercero y no tengo acceso para cambiarla. Peor aún, no creo que su parámetro realmente deba ser ref ...


El alcance de los valores que pueden usarse como un parámetro ref en C # está limitado por lo que permite el CLR. Se especifica en la especificación CLI en las secciones 12.4.1.5.2 y 12.1.6.1 e incluye

  • Argumento del método actual
  • Variable local
  • Miembro Campo de un objeto
  • Campo estático
  • Elemento de matriz

Un yeso no se ajusta a ninguno de estos y, por lo tanto, no se puede usar como valor de ref . Deberá asignarlo a un valor como local antes de pasarlo por referencia.


Un elenco no es una variable asignable; estás pasando un valor de retorno de tu operador de lanzamiento explícito.

Puede crear una variable que contenga el valor de conversión correcto antes de pasarlo como una referencia:

SomeClass someInstance = new SomeClass(); byte[] someBytes = (byte[])someInstance; SomeFunction(ref someBytes);

Tenga en cuenta que ahora es la variable someBytes que puede ser reasignada. Tendrá que tomar medidas para reasignar someInstance.someBytes de algún modo después de la llamada a SomeFunction si desea reasignar el valor interno de someInstance .


¿De verdad tienes que lanzar el parámetro ref? En mi caso, algo así funciona bien.

byte[] someInstance = (byte[])new SomeClass(); SomeFunction(ref someInstance);