¿C # 4.0 permite opcionales out
o ref
argumentos?
c#-4.0
optional-parameters
optional-arguments
Joe Daley
fuente
fuente
null
valor predeterminado ( vengo de PHP ) y probando paranull
proceder a completar el argumento ( para aquellos familiares, piensenpreg_match()
) De todos modos, aunque entiendo desde un punto técnico esto puede ser actualmente imposible, y que PHP y C # son bastante incomparables, todavía sería una herramienta " agradable " tener disponible.Respuestas:
Como ya se mencionó, esto simplemente no está permitido y creo que tiene mucho sentido. Sin embargo, para agregar más detalles, aquí hay una cita de la Especificación C # 4.0 , sección 21.1:
fuente
No.
Una solución alternativa es sobrecargar con otro método que no tiene parámetros out / ref, y que simplemente llama a su método actual.
Actualización: si tiene C # 7.0 , puede simplificar:
(Gracias @Oskar / @Reiner por señalar esto).
fuente
return SomeMethod(out string temp)
. Ver más aquí: blogs.msdn.microsoft.com/dotnet/2016/08/24/…return SomeMethod(out _);
No, pero otra gran alternativa es hacer que el método use una clase de plantilla genérica para parámetros opcionales de la siguiente manera:
Entonces puede usarlo de la siguiente manera:
fuente
En realidad, hay una manera de hacer esto que C # permite. Esto vuelve a C ++, y más bien viola la agradable estructura orientada a objetos de C #.
¡USE ESTE MÉTODO CON PRECAUCIÓN!
Esta es la forma en que declara y escribe su función con un parámetro opcional:
Luego llame a la función de esta manera:
Para que esto se compile, deberá habilitar el código inseguro en las opciones del proyecto. Esta es una solución realmente hacky que generalmente no debería usarse, pero si por alguna decisión extraña, arcana, misteriosa e inspirada en la administración, REALMENTE necesita un parámetro de salida opcional en C #, entonces esto le permitirá hacer exactamente eso.
fuente
ICYMI: incluidas en las nuevas funciones para C # 7.0 enumeradas aquí , "descartes" ahora está permitido como parámetros externos en forma de _, para permitirle ignorar los parámetros que no le interesan:
p.GetCoordinates(out var x, out _); // I only care about x
PD: si también estás confundido con la parte "out var x", lee también la nueva función sobre "Out Variables" en el enlace.
fuente
No, pero puede usar un delegado (por ejemplo
Action
) como alternativa.Inspirado en parte por la respuesta de Robin R al enfrentar una situación en la que pensé que quería un parámetro de salida opcional, en su lugar utilicé un
Action
delegado. He tomado prestado su código de ejemplo para modificarlo para usarloAction<int>
a fin de mostrar las diferencias y similitudesEsto tiene la ventaja de que la variable opcional aparece en la fuente como un int normal (el compilador la envuelve en una clase de cierre, en lugar de que la envuelvamos explícitamente en una clase definida por el usuario).
La variable necesita una inicialización explícita porque el compilador no puede suponer que
Action
se invocará antes de que finalice la llamada a la función.No es adecuado para todos los casos de uso, pero funcionó bien para mi caso de uso real (una función que proporciona datos para una prueba unitaria, y donde una nueva prueba unitaria necesitaba acceso a algún estado interno no presente en el valor de retorno).
fuente
Use un método sobrecargado sin el parámetro out para llamar al que tiene el parámetro out para C # 6.0 y versiones inferiores. No estoy seguro de por qué un C # 7.0 para .NET Core es incluso la respuesta correcta para este hilo cuando se le preguntó específicamente si C # 4.0 puede tener un parámetro de salida opcional. ¡La respuesta es no!
fuente
¿Qué tal así?
Aún debe pasar un valor al parámetro desde C #, pero es un parámetro de referencia opcional.
fuente
[Optional]
anotación. Esto no ayudafuente