32

I have downloaded and installed v5.0.0-preview.5. My project is targeting net5.0 but C# 9.0 is not working. How can I enable C# 9.0?

Daniel A. White
  • 187,200
  • 47
  • 362
  • 445
Jerzy Grzelec
  • 341
  • 1
  • 3
  • 6
  • Are you using Visual Studio 2019, Visual Studio Code, or just using the command-line and/or MSBuild? – Dai Jun 15 '20 at 23:47
  • Visual Studio 16.6.2. My project target net5.0 and build is successful but when I use any C# 9.0 feature it does not work and build fails – Jerzy Grzelec Jun 16 '20 at 00:01
  • Please post the exact compiler output error message from the Output window (not the Error List window), including the line that shows `csc` being invoked by MSBuild. – Dai Jun 16 '20 at 00:02
  • And as I asked earlier, please post the results of what happens when you try to build your project by calling `csc.exe` directly from the command-line without using VS or MSBuild. – Dai Jun 16 '20 at 00:02
  • 2
    I think that the version for c# 9 in dotnet 5 preview 5 is the same as in dotnet 5 preview 4. Using the instructions below one can compile the sample code from the preview 4 release notes, but you don't get the exciting "hot" bits from Mads presentation from May 20. eg. data class doesn't work nor does the "init" keyword for read-only properties. – Mike Wodarczyk Jun 16 '20 at 03:27
  • 2
    You can track features, which are implemented already in [feature status](https://github.com/dotnet/roslyn/blob/master/docs/Language%20Feature%20Status.md) page. Records are still in progress – Pavel Anikhouski Jun 16 '20 at 07:27
  • @JerzyGrzelec the VS version you use is too old. Even with the latest Preview for both VS and .NET Core though, only a couple of C# 9 features are available. A better question would be `How can I use C# 9's feature X?` – Panagiotis Kanavos Jun 25 '20 at 06:59
  • @PavelAnikhouski how can Linqpad use records? Even sharplab.io chokes. Is an extra library or switch needed? – Panagiotis Kanavos Jun 25 '20 at 07:00
  • @PanagiotisKanavos In sharplab you can switch to roslyn branch https://imgur.com/a/xWcCHJd – Pavel Anikhouski Jun 25 '20 at 07:06
  • @PavelAnikhouski chokes unless you create an empty `IsExternalInit` property. .NET 5 Preview 5 though doesn't even recognise `record`. So how does Linqpad 6 do it? – Panagiotis Kanavos Jun 25 '20 at 07:07
  • @PavelAnikhouski Preview 6 was released a few hours after the last comment. Records work with a little workaround now – Panagiotis Kanavos Jun 26 '20 at 12:09

4 Answers4

27

As of October 2020:

Please see @Pac0's answer here: https://stackoverflow.com/a/64386529/159145

As of June 2020:

According to this page in the documentation you need to edit your *.csproj to set the <LangVersion> to preview.

Also mentioned in the blog-post about the preview-release, but not the above documentation page, is that you need to update your project's targetFramework property too to net5.0 (this is because the C# design team decided to restrict entire C# language versions to minimum BCL versions, unlike previously where you could use C# 7 with even .NET Framework 2.0 provided you reimplemented your own missing BCL types like ValueTuple and ExtensionAttribute).

So your *.csproj file should look like this:

<Project>
 <PropertyGroup>
   <LangVersion>preview</LangVersion>
   <TargetFramework>net5.0</TargetFramework>
 </PropertyGroup>
</Project>
Dai
  • 141,631
  • 28
  • 261
  • 374
  • 1
    For those who don't know how to open the project file `*.csproj`: Right click your project on the `Solution Explorer` and choose `Edit Project File`. – Second Person Shooter Jun 15 '20 at 23:36
  • @JerzyGrzelec Try building your project from the command-line by invoking `csc.exe` directly first, and then try with `msbuild`. You may have other properties in your `.csproj` file that are overwriting them or VS may be using a different compiler instance (e.g. if you're using a compiler imported via NuGet instead of the VS2019 compiler). – Dai Jun 15 '20 at 23:39
  • @Dai 9.0 is not on my list. Do you know how to fix it? – Jerzy Grzelec Jun 15 '20 at 23:46
  • @JerzyGrzelec I removed the `csc langversion` part of my answer because it was inaccurate and misleading. – Dai Jun 15 '20 at 23:48
  • 2
    @JerzyGrzelec this does work. Most of the C# 9 features aren't released yet though. Have you tried using any of the features that *are* available? Have you tried installing one of the Preview versions of Visual Studio 2019? Records aren't released though, even in the latest preview – Panagiotis Kanavos Jun 25 '20 at 06:59
  • Records work in LINQPad 6 beta, but I think that one downloads the roslyn preview assemblies, and that the Visual Studio preview has more of a release cycle that is lagging slightly behind. – Lasse V. Karlsen Jun 26 '20 at 09:37
  • Not any more - .NET 5 Preview 6 was release yesterday with record, init support – Panagiotis Kanavos Jun 26 '20 at 12:10
  • Unfortunately I got the same issue. I installed .NET 5 Preview 6 (x64) on an up-to-date VS2019 (16.6.3). My langversion is set to `preview` and the compiler even tells me that it is running on a preview version. Tried some features like init and records, but only got syntax errors. – PuerNoctis Jul 01 '20 at 21:58
  • Ok, I had to use Preview 8 from the development branch and `dotnet build` directly. Using it out of VS2019 did not work for me sadly. – PuerNoctis Jul 01 '20 at 22:17
  • @PuerNoctis Could you please share the link to Preview 8 ? – Anu Viswan Jul 06 '20 at 01:56
  • @AnuViswan I have the preview from https://aka.ms/dotnet/net5/dev/Sdk/dotnet-sdk-win-x64.exe. The only thing that still is a little bit awry, is that I have to use `dotnet build` on the .csproj directly from CLI. Building out of VS2019, even with the "Use .NET Core Preview SDK" setting enabled, didn't work. – PuerNoctis Jul 06 '20 at 09:36
  • @PuerNoctis Thanks, finally managed get it running. Interesting, I was able to do build within VS2019. I am running VS2019 Preview , Version 16.7 Preview 3.1 – Anu Viswan Jul 06 '20 at 10:47
14

As per October 2020,

  1. you can explicitly use the 9.0 language version in .csproj
  2. Using target framework as .net 5 implicitly uses C# 9 by default .

The .csproj should be as such:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
  </PropertyGroup>
</Project>

You can add <LangVersion>9.0</LangVersion> if you wish, but it should be optional.

OutputType can be adapted, of course, and you'll need the .NET 5 SDK.

See for instance this blog for more information.

Pac0
  • 21,465
  • 8
  • 65
  • 74
7

Firstly Download .NET 5 and then install Visual Studio Preview Edition. You will now have access to the latest features of C# 9. Also make sure that you project file includes the following.

 <PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
<LangVersion>preview</LangVersion>
James
  • 290
  • 3
  • 8
0

If anyone sees this, you can use the VisualStudio installer to do this now.

Glatrix
  • 1
  • 1