Pregunta

Version corta:Un argumento con nombre que sigue a un out El argumento da un error de compilación, pero no puedo encontrar ningún soporte para este comportamiento en la especificación del lenguaje.

Versión larga:

estoy usando el Enum.TryParse<TEnum> sobrecarga de tres parámetros, pero preferiría nombrar el ignoreCase parámetro para aclarar mi código, una llamada como:

MyEnum res;
b = Enum.TryParse<MyEnum>(inputString, true, out res);

deja el significado del booleano poco claro (a menos que se conozca este método).1).Por eso me gustaría usar:

b = Enum.TryParse<MyEnum>(inputString, out res, ignoreCase: true);

Sin embargo, el compilador informa esto como un error:

El argumento con nombre 'ignoreCase' especifica un parámetro para el cual ya se ha proporcionado un argumento posicional

y el IDE destaca la ignoreCase parámetro.VS2010 dirigido a .NET 4 y VS11 Beta dirigido a 4 o 4.5 dan el mismo resultado.En todos los casos nombrar el out El parámetro elimina el error.

b = Enum.TryParse<MyEnum>(inputString, result: out res, ignoreCase: true);

He probado esto con varios métodos diferentes (incluido evitar los genéricos).2, tanto desde el marco como en mi ensamblaje:siempre el mismo resultado:un out El parámetro seguido de un parámetro con nombre da un error.

No veo ninguna razón para este error y §7.5.1 Listas de argumentos del Especificación del lenguaje C#:Versión 4.0 no parece proporcionar ninguna razón por la cual out seguido de un parámetro con nombre debería dar un error.El texto del error parece respaldar una interpretación como error:No existe ningún argumento posicional que pueda ser una coincidencia válida para ignoreCase.

¿Mi lectura de la especificación es incorrecta?¿O es esto un error del compilador?

Actualización de C# 7.2

Esta restricción de todos los argumentos con nombre debe seguir a los argumentos posicionales cuando la llamada se eliminó con C# 7.2.

Ver https://docs.microsoft.com/en-gb/dotnet/csharp/whats-new/csharp-7-2#non-trailing-named-arguments.


1 De ahí el consejo de las Directrices de diseño del marco de preferir enum parámetros.

2 P.ej:dado:

private static void TestMethod(int one, float two, out string three) {
  three = "3333";
}

esta llamada también da el mismo error en el parámetro nombrado a menos que el out El parámetro también se llama:

TestMethod(1, out aString, two: 1.0f);
¿Fue útil?

Solución

Los parámetros con nombre no le permiten "omitir" argumentos posicionales.

Su código se analiza pasando los dos primeros argumentos:value y ignoreCase, luego pasando ignoreCase de nuevo.
No tiene nada que ver con el outness del parámetro.

Puede solucionarlo pasando el último parámetro con el nombre también.

Otros consejos

Cada argumento posicional debe coincidir; si comienza a reorganizar el orden nombrando los argumentos, debe reorganizar todos los argumentos después del que nombró.

Entonces esta línea de código:

b = Enum.TryParse<MyEnum>(inputString, out res, ignoreCase: true);

intenta igualar out res con ignoreCase, y luego vuelves a nombrar ese parámetro, lo que hace que el compilador se active.Probablemente haya otro error acechando detrás del primero, que out res no es rival para ignoreCase.

Entonces, si desea "omitir" ignoreCase al tratar con argumentos posicionales, debe nombrar el out res argumento también.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top