Novedades de C# 7.1What's new in C# 7.1

C# 7.1 es la primera versión secundaria del lenguaje C#.C# 7.1 is the first point release to the C# language. Marca una cadencia de versión mayor en el lenguaje.It marks an increased release cadence for the language. Podrá usar las nuevas características más pronto, lo ideal es que cuando vayan estando listas.You can use the new features sooner, ideally when each new feature is ready. C# 7.1 incluye la posibilidad de configurar el compilador para que coincida con una versión especificada del lenguaje.C# 7.1 adds the ability to configure the compiler to match a specified version of the language. Ello permite aislar la decisión de actualizar las herramientas de la decisión de actualizar las versiones de lenguaje.That enables you to separate the decision to upgrade tools from the decision to upgrade language versions.

C# 7.1 incorpora el elemento de configuración de selección de versión de lenguaje, tres nuevas características de lenguaje y un nuevo comportamiento del compilador.C# 7.1 adds the language version selection configuration element, three new language features, and new compiler behavior.

Las nuevas características de lenguaje de esta versión son las siguientes:The new language features in this release are:

Por último, el compilador tiene dos opciones, -refout y -refonly, que controlan la generación de ensamblados de referencia.Finally, the compiler has two options -refout and -refonly that control reference assembly generation.

Para usar las características más recientes en una versión secundaria, tendrá que configurar la versión del idioma de compilador y seleccionar la versión.To use the latest features in a point release, you need to configure the compiler language version and select the version.

En el resto de este artículo se proporciona información general sobre cada característica.The remainder of this article provides an overview of each feature. Para cada característica, conocerá el razonamiento subyacente.For each feature, you'll learn the reasoning behind it. Aprenderá la sintaxis.You'll learn the syntax. Puede explorar estas características en su entorno mediante la herramienta global dotnet try:You can explore these features in your environment using the dotnet try global tool:

  1. Instale la herramienta global dotnet-try.Install the dotnet-try global tool.
  2. Clone el repositorio dotnet/try-samples.Clone the dotnet/try-samples repository.
  3. Establezca el directorio actual en el subdirectorio csharp7 para el repositorio try-samples.Set the current directory to the csharp7 subdirectory for the try-samples repository.
  4. Ejecute dotnet try.Run dotnet try.

Async mainAsync main

Un método async main permite usar await en el método Main.An async main method enables you to use await in your Main method. Anteriormente, hubiera sido necesario escribir lo siguiente:Previously you would need to write:

static int Main()
{
    return DoAsyncWork().GetAwaiter().GetResult();
}

Ahora se puede escribir esto:You can now write:

static async Task<int> Main()
{
    // This could also be replaced with the body
    // DoAsyncWork, including its await expressions:
    return await DoAsyncWork();
}

Si el programa no devuelve un código de salida, puede declarar un método Main que devuelva una Task:If your program doesn't return an exit code, you can declare a Main method that returns a Task:

static async Task Main()
{
    await SomeAsyncMethod();
}

En el artículo sobre async main de la guía de programación puede leer más detalles al respecto.You can read more about the details in the async main article in the programming guide.

Expresiones literales predeterminadasDefault literal expressions

Las expresiones literales predeterminadas constituyen una mejora con respecto a las expresiones de valor predeterminadas.Default literal expressions are an enhancement to default value expressions. Estas expresiones inicializan una variable en el valor predeterminado.These expressions initialize a variable to the default value. Donde anteriormente habría que escribir:Where you previously would write:

Func<string, bool> whereClause = default(Func<string, bool>);

Ahora, se puede pasar por alto el tipo del lado derecho de la inicialización:You can now omit the type on the right-hand side of the initialization:

Func<string, bool> whereClause = default;

Para más información, consulte la sección Literal default del artículo Operador default.For more information, see the default literal section of the default operator article.

Nombres de elementos de tupla inferidosInferred tuple element names

Esta característica supone una pequeña mejora con respecto a la característica de tuplas incluida en C# 7.0.This feature is a small enhancement to the tuples feature introduced in C# 7.0. Muchas veces, cuando se inicializa una tupla, las variables usadas en el lado derecho de la asignación son las mismas que los nombres que querríamos dar a los elementos de tupla:Many times when you initialize a tuple, the variables used for the right side of the assignment are the same as the names you'd like for the tuple elements:

int count = 5;
string label = "Colors used in the map";
var pair = (count: count, label: label);

Ahora, los nombres de los elementos de tupla se pueden deducir de las variables empleadas para inicializar la tupla en C# 7.1:The names of tuple elements can be inferred from the variables used to initialize the tuple in C# 7.1:

int count = 5;
string label = "Colors used in the map";
var pair = (count, label); // element names are "count" and "label"

Encontrará más información sobre esta característica en el artículo sobre tuplas.You can learn more about this feature in the Tuples article.

Coincidencia de patrones en parámetros de tipo genéricoPattern matching on generic type parameters

A partir de C# 7.1, la expresión de patrón para is y el patrón de tipo switch pueden tener el tipo de un parámetro de tipo genérico.Beginning with C# 7.1, the pattern expression for is and the switch type pattern may have the type of a generic type parameter. Esto puede ser especialmente útil al comprobar los tipos que pueden ser tipos struct o class y si quiere evitar la conversión boxing.This can be most useful when checking types that may be either struct or class types, and you want to avoid boxing.

Generación de ensamblados de referenciaReference assembly generation

Existen dos nuevas opciones del compilador con las que se generan ensamblados solo de referencia: -refout y -refonly.There are two new compiler options that generate reference-only assemblies: -refout and -refonly. En los artículos de los vínculos se explican estas opciones y los ensamblados de referencia de manera más pormenorizada.The linked articles explain these options and reference assemblies in more detail.