c# - parameter - Parámetros de salida opcionales
parametros opcionales c# (5)
Decorar los parámetros con OptionalAttribute tampoco funciona. Para ampliar la muestra anterior, obtendrías algo como:
private void Func(
[Optional] out int optional1,
[Optional] out string optional2)
{ /* ... */ }
Tenga en cuenta que lo anterior se compilará (quizás desafortunadamente). Sin embargo, intentando compilar:
Func(out i);
fallará a menos que se proporcione explícitamente una sobrecarga con una firma de un parámetro.
Hacer (teóricamente) el trabajo anterior es un problema importante. Cuando se llama a un método con un parámetro opcional omitido, se crea un marco de pila que contiene los valores de todos los parámetros, y los valores faltantes simplemente se rellenan con los valores predeterminados especificados.
Sin embargo, un parámetro "fuera" es una referencia, no un valor. Si ese parámetro es opcional y no se proporciona, ¿a qué variable haría referencia? El compilador aún debe cumplir el requisito de que el parámetro "fuera" se complete antes de cualquier retorno normal del método, ya que el compilador no conoce a priori, los parámetros opcionales (si los hay) son especificados por el llamante. Esto significa que se debería pasar una referencia a una variable ficticia en algún lugar para que el método tenga algo que rellenar. La gestión de este espacio variable ficticio crearía un dolor de cabeza desagradable para el escritor del compilador. No estoy diciendo que sería imposible averiguar los detalles de cómo funcionaría esto, pero las implicaciones arquitectónicas son lo suficientemente grandes como para que Microsoft supiera esta característica.
Esta pregunta ya tiene una respuesta aquí:
- C # 4.0 argumentos opcionales de salida / referencia 8 respuestas
En C # 4, ¿hay una buena manera de tener un parámetro de salida opcional?
No realmente, aunque siempre puede sobrecargar el método con otro que no tome el parámetro de salida.
No.
Para hacerlo "opcional", en el sentido de que no es necesario asignar un valor en el método, puede usar ref
.
private object[] Func();
¡asigne tantas salidas opcionales como desee en la matriz de objetos de retorno y luego úselas! pero si te refieres a la salida opcional algo así como
private void Func(out int optional1, out string optional2)
y luego llamas a algo como
Func(out i);
Entonces la respuesta es no, no puedes. Además, C # y .NET framework tienen muchas estructuras de datos que son muy flexibles como List
y Array
y puede usarlas como un parámetro de salida o como tipo de retorno, por lo que no es necesario implementar una forma de tener parámetros de salida opcionales.
public class Dummy<T>
{
public T Value;
}
Luego use functionDoSomething(out new Dummy<int>().Value
, donde int
podría ser de cualquier tipo.