So aktivieren Sie die Funktion "Nullable Reference Types" von C # 8.0 für das gesamte Projekt

79

Laut dem C # 8-Ankündigungsvideo kann die Funktion "Nullable Reference Types" für das gesamte Projekt aktiviert werden.

Aber wie kann man es für das Projekt aktivieren? Ich habe keine neue geeignete Option im Fenster Projekteigenschaften in Visual Studio 2019 Vorschau 1 gefunden.

Kann es für "Legacy" .csproj-Projekte aktiviert werden, wenn die C # -Sprachenversion auf 8.0 geändert wird?

Sergey V.
quelle

Antworten:

79

In Visual Studio 16.2 (aus Vorschau 1) wurde der Eigenschaftsname geändert, Nullableder einfacher ist und mit dem Befehlszeilenargument übereinstimmt.

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

Beachten Sie, dass Sie beim Targeting netcoreapp3.0oder höher keine LangVersion8 angeben müssen , da dies die Standardeinstellung in .NET Core 3 ist.


Für ältere Visual Studio-Versionen:

  • Von 16.0 Vorschau 2-16,1 Satz NullableContextOptionszuenable
  • In 16,0 Vorschau 1 Satz NullableReferenceTypeszutrue
Drew Noakes
quelle
3
Ich habe es gerade mit VS 2019 / 16.1.1 versucht und es schien nichts zu tun. Um es zu testen, habe ich dann in einer der Klassen #nullable enable eingegeben und dann die Warnungen zu Nullobjekten angezeigt.
Larry Smith
2
@ LarrySmith entschuldigt sich, diese Änderung wurde in 16.2P1 vorgenommen. Ich habe meine Antwort aktualisiert. In 16.1.1 brauchen Sie NullableContextOptionsnoch.
Drew Noakes
1
Beachten Sie, dass die boolesche Logik möglicherweise etwas nicht intuitiv ist: enablebedeutet "Aktivieren Sie die neue C # 8.0-Einstellung, bei der Typen standardmäßig nicht nullwertfähig sind". disablebedeutet "mach es auf die alte Art und Weise, wo jeder Typ nullbar ist."
Ryan Lundy
1
Ich musste auch <Project ToolsVersion = "16.0" ...> und <VisualStudioVersion ...> 16.0 </ VisualStudioVersion> von den älteren "15,0" aktualisieren, bevor <Nullable> für ältere Nicht-SDK-Projekte funktionieren würde. obwohl sie über die Eigenschaften-GUI von VS 16.3 RTM korrekt auf Framework 4.8 aktualisiert wurden. Nur die C # 8-Sprachversion wurde ohne zusätzliche Bearbeitung der Projektdatei berücksichtigt.
Tony Wall
1
@ TonyWall Ich bin neugierig, warum du das gebraucht hast. Ich habe gerade eine neue .NET Framework-Konsolen-App in VS 16.3.7 (dh ein Projekt ohne SDK-Stil) erstellt, hinzugefügt LangVersionund NullableEigenschaften hinzugefügt , .csprojund es funktioniert einwandfrei. Das Projekt hat ToolsVersion="15.0"auch.
Drew Noakes
32

Beachten Sie, dass sich diese Einstellung zwischen VS 2019 Vorschau 1 und Vorschau 2 geändert hat. Bei Vorschau 2 oder 3 benötigen Sie diese Einstellung in .csproj:

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

Die <NullableReferenceTypes>in der früheren Antwort erwähnte (die, als ich diese Antwort ursprünglich am 4. Februar 2019 schrieb, als akzeptierte Antwort markiert war) war zum Zeitpunkt der Erstellung der Antwort korrekt, wird jedoch nicht mehr erkannt.

Ian Griffiths
quelle
Weitere Informationen zu verfügbaren Werten für diese Option ( enable, disable, safeonlyetc.): github.com/dotnet/roslyn/blob/master/docs/features/...
Sergey V
8
Hat sich dies in einer kürzlich veröffentlichten Version erneut geändert? Dies scheint nicht für mich in Vorschau 4.2
Waldrumpus
5
Seit Visual Studio 6.2 wurde <NullableContextOptions> auf <Nullable> vereinfacht (siehe die akzeptierte Antwort)
Andrew Hill
13

Beachten Sie, dass zusätzlich zu der von @DrewNoakes akzeptierten Antwort die Eigenschaft nullable für alle Projekte gleichzeitig festgelegt werden kann, indem Sie eine Datei hinzufügen, die Directory.Build.propsin dem Ordner aufgerufen wird , der Ihre .slnDatei enthält .

Definieren Sie Ihre Directory.Build.propsDatei einfach so:

<Project>

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

</Project>

Sie müssen Visual Studio neu starten, damit dies wirksam wird.

Mehr über Directory.Build.props

Maxime Gélinas
quelle
7

Für Visual Studio 2019 Preview 2 & 3 siehe Ian Griffiths Antwort

Lösung für Visual Studio 2019 Vorschau 1 :

Um die Funktion "Nullable Referenztypen" für das .NET Core-Projekt zu aktivieren, fügen Sie NullableReferenceTypesder .csprojDatei folgende Eigenschaften hinzu :

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

Da in den Kommentaren zu https://github.com/dotnet/project-system/issues/4058 auf @JulienCouvreur verwiesen wird, wird die neue Eigenschaft im "alten" Projektsystem noch nicht unterstützt. Wird jedoch vor der Veröffentlichung von C # 8.0 unterstützt.

Sergey V.
quelle
Haben Sie versucht, das Ziel-Framework auf zu ändern net472? Wie / wo haben Sie diese Einstellung übrigens gefunden? Diese Referenz wäre sehr nützlich. Ich habe viele Dinge gefunden, die nicht ganz funktionieren, wie im Video gezeigt
Panagiotis Kanavos
@PanagiotisKanavos, dieses Tag wurde in Kommentaren auf YouTube von Mads Torgersen - dem Autor des Videos, das ich in der ursprünglichen Frage verlinkt habe
Sergey V
1
Diese Eigenschaft wird in "alten" Projekten noch nicht unterstützt. Das Problem wird von github.com/dotnet/project-system/issues/4058
Julien Couvreur
7

Legacy-csproj-Format

Sie haben nach dem Legacy- .csprojFormat gefragt . Öffnen Sie die Projektdatei in einem Texteditor und nehmen Sie folgende Änderungen vor:

  1. Hinzufügen / Ändern <LangVersion>8.0</LangVersion>in den Abschnitten Debugund ReleasePropertyGroup:

    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
       <LangVersion>preview</LangVersion>
    
  2. Aktivieren der Unterstützung für Nullable - Referenztypen durch Zugabe <Nullable>enable</Nullable>zu dem Haupt PropertyGroup:

    <PropertyGroup>
       <Nullable>enable</Nullable>
    

Getestet mit einer .NET WinForms-App unter Verwendung der Syntax von C # 8 und nullbaren Referenztypen in Visual Studio 2019 v16.2.0 Vorschau 3.


Projektdateien im SDK-Stil

Projekte im SDK-Stil sind viel einfacher und können in Visual Studio bearbeitet werden. Für diese benötigen Sie lediglich (im selben PropertyGroupwie TargetFrameworkoder TargetFrameworks):

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

Anmerkungen

  • .NET Core 3.x-Projekte zielen standardmäßig auf C # 8 ab , sodass Sie das LangVersionfür diese Projekte nicht angeben müssen .

  • Die Standardeinstellung für .NET Framework-Projekte ist C # 7.3, und Sie erhalten C # 8.0 auch mit nicht <LangVersion>latest</LangVersion>. Sie müssen die Sprachversion explizit auf 8.0 einstellen. Bitte beziehen Sie sich auf meine Antwort auf die Frage Unterstützt C # 8 .NET Framework? für mehr Details.

Stephen Kennedy
quelle
2

Es ist erwähnenswert, dass dies mittlerweile auch eine exponierte Einstellung auf der Eigenschaftenseite eines Projekts ist: Auf der Registerkarte "Build" wird die Einstellung "Nullable" angezeigt

Zumindest in VS2019 16.6+

Ian Yates
quelle