Cómo habilitar la función de tipos de referencia que aceptan valores NULL de C # 8.0 para todo el proyecto

81

Según el vídeo de anuncio de C # 8, la función "tipos de referencia que aceptan valores NULL" se puede habilitar para todo el proyecto.

Pero, ¿cómo habilitarlo para el proyecto? No encontré ninguna nueva opción apropiada en la ventana Propiedades del proyecto en Visual Studio 2019 Preview 1.

¿Se puede habilitar para .csprojproyectos 'heredados' si la versión del lenguaje C # se cambia a 8.0?

Sergey V
fuente

Respuestas:

84

En Visual Studio 16.2 (desde la vista previa 1), el nombre de la propiedad se cambia a Nullable, que es más simple y se alinea con el argumento de la línea de comandos.

<PropertyGroup>
  ...
  <Nullable>enable</Nullable>
  <LangVersion>8.0</LangVersion>
</PropertyGroup>

Tenga en cuenta que si tiene como objetivo netcoreapp3.0o posterior, no necesita especificar un LangVersion8, ya que ese es el valor predeterminado en .NET Core 3.


Para versiones anteriores de Visual Studio:

  • Desde 16.0 vista previa 2 a 16.1, establezca NullableContextOptionsen enable.
  • En 16.0 vista previa 1, establezca NullableReferenceTypesen true.
Dibujó Noakes
fuente
3
Intenté esto con VS 2019 / 16.1.1 y no pareció hacer nada. Para probarlo, fui y puse #nullable enable en una de las clases y luego pude ver las advertencias sobre objetos nulos.
Larry Smith
2
@LarrySmith se disculpa, este cambio se realizó en 16.2P1. Actualicé mi respuesta. En 16.1.1 necesitará NullableContextOptionstodavía.
Drew Noakes
1
Tenga en cuenta que la lógica booleana puede ser un poco poco intuitiva: enablesignifica "habilitar la nueva configuración de C # 8.0 donde los tipos no aceptan valores NULL de forma predeterminada". disablesignifica "hágalo a la antigua, donde todos los tipos son anulables".
Ryan Lundy
1
También tuve que actualizar <Project ToolsVersion = "16.0" ...> y <VisualStudioVersion ...> 16.0 </VisualStudioVersion> del antiguo "15,0" antes de que el <Nullable> funcionara en proyectos antiguos que no son SDK, aunque se actualizaron correctamente al marco 4.8 a través de la GUI de propiedades de VS 16.3 RTM. Solo se respetó la versión en lenguaje C # 8 sin ninguna edición adicional del archivo del proyecto.
Tony Wall
1
@TonyWall Tengo curiosidad por saber por qué lo necesitabas. Acabo de crear una nueva aplicación de consola .NET Framework en VS 16.3.7 (es decir, un proyecto de estilo que no es SDK), agregué LangVersiony Nullablepropiedades al .csprojy funciona bien. El proyecto ToolsVersion="15.0"también.
Drew Noakes
32

Tenga en cuenta que esta configuración se cambia entre la vista previa 1 y la vista previa 2 de VS 2019. Con la vista previa 2 o 3, necesita esto en su .csproj:

<PropertyGroup>
  <LangVersion>8.0</LangVersion>
  <NullableContextOptions>enable</NullableContextOptions>
</PropertyGroup>

Lo <NullableReferenceTypes>mencionado en la respuesta anterior (que, cuando escribí originalmente esta respuesta el 4 de febrero de 2019, se había marcado como la respuesta aceptada) era correcta en el momento en que se escribió la respuesta, pero ya no se reconoce.

Ian Griffiths
fuente
más información acerca de los valores disponibles para esta opción ( enable, disable, safeonlyetc.): github.com/dotnet/roslyn/blob/master/docs/features/...
Sergey V
8
¿Ha cambiado esto de nuevo en un lanzamiento reciente? Esto no parece funcionar para mí en la Vista previa 4.2
waldrumpus
5
Desde Visual Studio 6.2 <NullableContextOptions> se ha simplificado a solo <Nullable> (consulte la respuesta aceptada)
Andrew Hill
13

Además de la respuesta aceptada de @DrewNoakes, tenga en cuenta que la propiedad anulable se puede establecer para todos los proyectos a la vez agregando un archivo llamado Directory.Build.propsen la carpeta que contiene su .slnarchivo.

Simplemente defina su Directory.Build.propsarchivo así:

<Project>

  <PropertyGroup>
    <Nullable>enable</Nullable>
  </PropertyGroup>

</Project>

Deberá reiniciar Visual Studio para que esto surta efecto.

Más sobre Directory.Build.props.

Maxime Gélinas
fuente
8

Para Visual Studio 2019 Preview 2 y 3 , consulte la respuesta de Ian Griffiths.

Solución para Visual Studio 2019 Preview 1 :

Para habilitar la característica Tipos de referencia que aceptan valores NULL para el proyecto .NET Core, agregue una NullableReferenceTypespropiedad al .csprojarchivo de esta manera:

<PropertyGroup>
  ...
  <NullableReferenceTypes>true</NullableReferenceTypes>
  <LangVersion>8.0</LangVersion>
</PropertyGroup>

Como @JulienCouvreur mencionó en los comentarios sobre https://github.com/dotnet/project-system/issues/4058 , la nueva propiedad aún no es compatible con el sistema de proyecto 'antiguo', pero será compatible antes del lanzamiento de C # 8.0.

Sergey V
fuente
¿Ha intentado cambiar el marco de destino a net472? Por cierto, ¿cómo / dónde encontraste ese escenario? Esa referencia sería muy útil. Encontré muchas cosas que no funcionan como se muestra en el video
Panagiotis Kanavos
@PanagiotisKanavos, esa etiqueta fue propuesta en comentarios en YouTube por Mads Torgersen, el autor del video que vinculé en la pregunta original
Sergey V
1
Esta propiedad aún no es compatible con proyectos "antiguos". El problema se rastrea en github.com/dotnet/project-system/issues/4058
Julien Couvreur
7

Formato csproj heredado

Preguntaste sobre el .csprojformato heredado . Abra el archivo del proyecto en un editor de texto y realice los siguientes cambios:

  1. Agregar / cambiar <LangVersion>8.0</LangVersion>en las secciones Debugy ReleasePropertyGroup:

     <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
        <LangVersion>preview</LangVersion>
    
  2. Habilite la compatibilidad con tipos de referencia que aceptan valores NULL agregando <Nullable>enable</Nullable>a main PropertyGroup:

     <PropertyGroup>
        <Nullable>enable</Nullable>
    

Probado con una aplicación .NET WinForms utilizando C # 8 y sintaxis de tipos de referencia que aceptan valores NULL en Visual Studio 2019 v16.2.0 Preview 3.


Archivos de proyecto de estilo SDK

Los proyectos de estilo SDK son mucho más simples y se pueden editar en Visual Studio. Para estos, todo lo que necesita es (al igual PropertyGroupque TargetFrameworko TargetFrameworks):

  <PropertyGroup>
    <LangVersion>8.0</LangVersion>
    <Nullable>enable</Nullable>
  </PropertyGroup>

Notas

  • Los proyectos .NET Core 3.x tienen como destino C # 8 de forma predeterminada , por lo que no necesitará especificar el LangVersionpara esos proyectos.

  • El valor predeterminado para los proyectos de .NET Framework es C # 7.3 y no obtiene C # 8.0 incluso con <LangVersion>latest</LangVersion>. Debe establecer explícitamente la versión de idioma en 8.0. Consulte mi respuesta a la pregunta ¿C # 8 es compatible con .NET Framework? para más detalles.

Stephen Kennedy
fuente
3

Vale la pena señalar que, por ahora, esta también es una configuración expuesta en la página de Propiedades de un proyecto:

La pestaña "Construir" muestra la configuración "Nullable"

Al menos en VS2019 16.6+.

Ian Yates
fuente