Tengo un código asincrónico al que me gustaría agregar un código CancellationToken
. Sin embargo, hay muchas implementaciones en las que esto no es necesario, por lo que me gustaría tener un parámetro predeterminado, tal vez CancellationToken.None
. Sin embargo,
Task<x> DoStuff(...., CancellationToken ct = null)
rendimientos
Un valor de tipo '' no se puede usar como parámetro predeterminado porque no hay conversiones estándar para escribir 'System.Threading.CancellationToken'
y
Task<x> DoStuff(...., CancellationToken ct = CancellationToken.None)
El valor del parámetro predeterminado para 'ct' debe ser una constante en tiempo de compilación
¿Hay alguna forma de tener un valor predeterminado para CancellationToken
?
CancellationToken.None
convierte en algo más quedefault(CancellationToken)
.default(CancellationToken)
?CancellationToken.None
se vuelva obsoleto de facto. Incluso Microsoft está usando en sudefault(CancellationToken)
lugar. Por ejemplo, vea estos resultados de búsqueda del código fuente de Entity Framework.Desafortunadamente, esto no es posible, ya
CancellationToken.None
que no es una constante de tiempo de compilación, que es un requisito para los valores predeterminados en los argumentos opcionales.Sin embargo, puede proporcionar el mismo efecto si crea un método sobrecargado en lugar de intentar utilizar los parámetros predeterminados:
fuente
CancellationToken cancellationToken = default(CancellationToken)
? También se describe aquí blogs.msdn.microsoft.com/andrewarnottms/2014/03/19/…Aquí hay varias soluciones, en orden descendente de bondad general:
1. Usando
default(CancellationToken)
como valor predeterminado:Semánticamente,
CancellationToken.None
sería el candidato ideal para el valor predeterminado, pero no se puede usar como tal porque no es una constante en tiempo de compilación.default(CancellationToken)
es la mejor opción porque es una constante en tiempo de compilación y está oficialmente documentada como equivalente aCancellationToken.None
.2. Proporcionar una sobrecarga de método sin un
CancellationToken
parámetro:O, si prefiere las sobrecargas de métodos sobre los parámetros opcionales (consulte esta y esta pregunta sobre ese tema):
Para los métodos de interfaz, se puede lograr lo mismo utilizando métodos de extensión:
Esto da como resultado una interfaz más delgada y evita que los implementadores escriban explícitamente la sobrecarga del método de reenvío.
3. Hacer que el parámetro sea anulable y usar
null
como valor predeterminado:Me gusta esta solución menos porque los tipos que aceptan valores NULL vienen con una pequeña sobrecarga de tiempo de ejecución, y las referencias al token de cancelación se vuelven más detalladas debido al operador de fusión nulo
??
.fuente
Otra opción es usar un
Nullable<CancellationToken>
parámetro, establecerlo por defectonull
y tratarlo dentro del método:fuente
Las versiones más recientes de C # permiten una sintaxis simplificada para la versión predeterminada (CancellationToken). P.ej:
fuente
La respuesta de Tofutim es unidireccional, pero por los comentarios veo que la gente tiene problemas con eso.
En ese caso, sugerí que uno puede tener un método de la siguiente manera:
y sobrecargarlo como:
Esto se compila porque
CancellationToken.None
no se requiere el valor de en el momento de la compilación.fuente