如何在Visual Studio 2017中使用C#8?

如何在Visual Studio 2017中使用C#8?,c#,visual-studio,visual-studio-2017,c#-8.0,C#,Visual Studio,Visual Studio 2017,C# 8.0,我想在Visual Studio 2017中使用C#8.0(特别是范围和不可为空的引用类型)。有可能吗?添加到series0ne关于主要版本的评论中:的确,新的VS通常附带新的C版本。然而,根据过去的经验,可以将VS编译器的早期版本升级为C#代码的更新版本,主要是通过升级“Microsoft.Net.Compilers”Nuget包。你可以参考这篇文章了解更多信息 因此当前信息是: Visual Studio 2019已经发布;它不再在预览中 C#8仍在预览中() Visual Studio

我想在Visual Studio 2017中使用C#8.0(特别是范围和不可为空的引用类型)。有可能吗?

添加到series0ne关于主要版本的评论中:的确,新的VS通常附带新的C版本。然而,根据过去的经验,可以将VS编译器的早期版本升级为C#代码的更新版本,主要是通过升级“Microsoft.Net.Compilers”Nuget包。你可以参考这篇文章了解更多信息

因此当前信息是:

  • Visual Studio 2019已经发布;它不再在预览中
  • C#8仍在预览中()
  • Visual Studio 2019或最新的.NET Core 3.0预览版提供了C#8 beta编译器。()


从这一点,我推断C#8目前在VS2017中不可用,并且没有计划改变这一点。

今后,微软希望将C#语言版本与框架版本的联系比过去更紧密。他们真的只想让你在.NETCore3.x和.NETStandard2.1项目中使用C#8,这意味着使用VisualStudio2019。我对你的回答包含了所有血淋淋的细节

但是,如果您确实想现在可以在Visual Studio 2017中使用C#8,方法是将C#7引入Visual Studio 2015:将最新版本的安装到项目中。这是可行的,但是VS2017当然不知道C#8语法,所以看起来不太好看。下面的屏幕截图显示VS2017能够使用可空引用类型和静态本地方法编译一个小型测试库(两者都是C#8特性):


下面是.csproj和代码,如果您想尝试它:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>netstandard2.0;net452</TargetFrameworks>
    <LangVersion>8.0</LangVersion>    
    <Nullable>enable</Nullable>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.Net.Compilers" Version="3.3.1">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
    </PackageReference>
  </ItemGroup>
</Project>
您可以在vs2017中使用而不是
Microsoft.Net.Compilers

此软件包用于Microsoft.Net.Compilers(仅限Windows的软件包)和Microsoft.NETCore.Compilers。这些软件包现在已弃用,将来将被删除

该包需要MSBuild 15.0和.NET Destkop 4.7.2或.NET Core 2.1

包裹

与vs2019相比,软件包版本映射了c#8支持的能力

  • 版本3.0包括C#8.0(Visual Studio 2019版本16.0)的预览版,但预览版1使用了2.11
  • 版本3.1包括C#8.0的预览版(Visual Studio 2019版本16.1)
  • 版本3.2包括C#8.0的预览版(Visual Studio 2019版本16.2)
  • 版本3.3包括C#8.0(Visual Studio 2019版本16.3、.NET Core 3.0)
如何使用

将这些行添加到.csproj


//....
8
使可能
您也可以在Visual Studio 2019中的任何.NET项目中使用C#8

虽然有一些限制,但这是可能的

using System;

namespace CSharp8Test
{
    public class Class1
    {
        public string? NullableString { get; } = "Test";

        public static void Test()
        {
            Console.WriteLine(Test2());
            static int Test2() => 5;
        }
    }
}