“using declarations” 功能在 C# 7.3 中不可用。请使用语言版本 8.0 或更高版本 - 在一个机器上出现错误,但在另一个机器上正常运行。

135

在两台分离的计算机上使用 Visual Studio Enterprise 16.3.7,其中一台可以正常构建,而另一台会出现以下错误:

C# 7.3 中不支持 'using 声明' 特性。请使用语言版本 8.0 或更高版本。

enter image description here

enter image description here

可以通过在无法工作的计算机上设置 .csproj 中的 LangVersion 来轻松解决此问题,如此处所述 https://dev59.com/aFYN5IYBdhLWcg3wHU-9#48085575 或者像上面的截图那样让 Visual Studio 自动修复它。

<LangVersion>8.0</LangVersion>

我不理解的是为什么一台机器在 .csproj 中没有这行代码也能成功构建,而另一台机器却需要它呢?


如果你遇到这样的错误,这意味着它不是C# 8项目,或者你使用带有分析错误的Resharper版本。 - Panagiotis Kanavos
你的csproj文件中的TargetFramework和LangVersion是什么? - Panagiotis Kanavos
@PanagiotisKanavos 是的,但是该项目在一台机器上构建而在另一台机器上却不能 - 这就是我不理解的地方。没有使用 ReSharper。 - Ogglas
@PanagiotisKanavos 目标框架为 .NET Framework 4.6.1, 且 LangVersion 未设置。 - Ogglas
检查在调试和构建配置中是否设置了“LangVersion”。这两台机器可能设置为构建不同的构建配置? - LorneCash
显示剩余3条评论
10个回答

144

我收到了同样的错误,但我只是简单地忘记了包括

<LangVersion>8.0</LangVersion>
在解决方案中的所有.csproj文件中涉及到的属性。 以下是我当前的c# 8设置:
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <LangVersion>8.0</LangVersion>
    <Nullable>enable</Nullable>
    <NullableContextOptions>enable</NullableContextOptions>
  </PropertyGroup>

在从2.2迁移到3.x时,我发现以下文件最有用:

MSDN 2.2 -> 3.0

MSDN 3.0 -> 3.1


45
你可以使用 <LangVersion>latest</LangVersion> 代替 <LangVersion>8.0</LangVersion> - Eliahu Aaron
2
我认为第一个链接“MSDN 2.2 -> 3.0”应该链接到以下网址: https://learn.microsoft.com/en-us/aspnet/core/migration/22-to-30我尝试编辑答案进行修改,但是“建议的编辑队列已满”,所以我会在这里发布。 - Andrew Hillier
1
这个答案确实直接回答了问题,但我感觉它忽略了另一个可能出现的问题。默认情况下,就像其他答案提到的那样,值是“latestMajor”。答案不是盲目地硬编码版本(如果可用,您的编译器应该使用它),而是找出为什么编译器选择了错误的版本。 - Marie
7
请确保将 <LangVersion> 放在 <PropertyGroup> 内部,而不是放在 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == '<some specific config>' "> 内部。 - Artemious
1
@Artemious 我也遇到了这个问题。谢谢!我看到版本号是正确的,但就是编译不了。 - B.O.B.
我遇到了这个问题,因为我的“调试”项目文件以某种方式被设置为“最新版本”,但“发布版”没有。所以,在“调试”模式下运行针对4.8的代码正常,但在“发布”模式下会出现编译器错误。将其更改为“最新版本”会修复这些错误,并且代码运行正常?!?这意味着其中一些错误不是真实存在的? - Mmm

130
这可能是由于编译器在不同的目标框架中默认使用不同版本的C#语言所致。
要覆盖默认的C#语言版本,请按照问题建议,向项目文件中添加:
<PropertyGroup>
   <LangVersion>8.0</LangVersion>
</PropertyGroup>

或者:

<PropertyGroup>
   <LangVersion>latest</LangVersion>
</PropertyGroup>

注意:不建议使用比默认版本更新的语言版本。
来自C# 语言版本控制 - Microsoft Docs(截至2022年03月11日):

这个默认选择还可以确保您不会使用需要目标框架中不可用的类型或运行时行为的语言。选择比默认版本更新的语言版本可能会导致难以诊断的编译时和运行时错误。


请参阅Microsoft Docs的C#语言版本控制,了解不同目标框架的默认C#语言版本以及如何手动选择C#语言版本。

此外,请参阅堆栈溢出答案C# 8是否支持.NET Framework?,以获取有关此主题的更多信息。


以下是关于不同目标框架的默认语言版本的C#语言版本控制-Microsoft Docs文章的一部分(截至2022年03月11日):

C# language versioning

The latest C# compiler determines a default language version based on your project's target framework or frameworks. Visual Studio doesn't provide a UI to change the value, but you can change it by editing the csproj file. The choice of default ensures that you use the latest language version compatible with your target framework. You benefit from access to the latest language features compatible with your project's target. This default choice also ensures you don't use a language that requires types or runtime behavior not available in your target framework. Choosing a language version newer than the default can cause hard to diagnose compile-time and runtime errors.

C# 10 is supported only on .NET 6 and newer versions. C# 9 is supported only on .NET 5 and newer versions. C# 8.0 is supported only on .NET Core 3.x and newer versions.

...

Defaults

The compiler determines a default based on these rules:

╔══════════════════╦═════════╦═════════════════════════════╗
║ Target framework ║ version ║ C# language version default ║
╠══════════════════╬═════════╬═════════════════════════════╣
║ .NET             ║ 6.x     ║ C# 10                       ║
║ .NET             ║ 5.x     ║ C# 9.0                      ║
║ .NET Core        ║ 3.x     ║ C# 8.0                      ║
║ .NET Core        ║ 2.x     ║ C# 7.3                      ║
║ .NET Standard    ║ 2.1     ║ C# 8.0                      ║
║ .NET Standard    ║ 2.0     ║ C# 7.3                      ║
║ .NET Standard    ║ 1.x     ║ C# 7.3                      ║
║ .NET Framework   ║ all     ║ C# 7.3                      ║
╚══════════════════╩═════════╩═════════════════════════════╝

1
很棒的答案,非常详尽 =) - Ted
非常好的答案。我想补充一点,需要安装.NET Core 3和至少VS 2019。 - CodeSerendipity
这是一个不太正规的权宜之计,但并非解决方案。Sudharshann的回答能起到作用。 - ursa
这是一个不太正规的权宜之计,但并非解决方案。Sudharshann的回答能解决问题。 - undefined

23

1
这似乎不适用于.NET Framework - 我使用的是16.7.3版本。 - Chris Nevill

9
我下载了最新版本的 .Net Core 3.0 和 3.1,但遇到了同样的问题。解决方法是下载 Visual Studio 2019 的最新更新(到16.4.2 版本)。这个操作会重启电脑,然后错误就消失了。

那不是VS2019的版本号,它们看起来像16.x.y。请使用帮助>关于。 - Hans Passant
4.7.03056是.NET Framework的一个版本,目前最新的VS版本是16.4.4。 - Alex

7

2021

问题:您可能正在针对使用 C# 7.3.NET Standard 2.0 进行目标设置。

解决方案:在项目的 属性 下,单击 应用程序 面板,并选择 .NET Standard 2.1 作为 目标框架

上述更改后,Visual Studio 2019 将自动修复此问题,不需要任何 LangVersion 设置。

请参见:C# 语言版本控制

enter image description here


1
尝试在一个新的Xamarin shell应用程序中使用复制的代码时出现了这个问题,该应用程序似乎在其模板中使用.NET Standard 2.0。在属性中将目标框架更改为.NET 2.1确实是解决方法。 - TLP
@TLP 很高兴对你有所帮助。问候。 - Sabuncu
你知道为什么IDE支持更高的C#语言级别吗?我有一个针对4.8版本的项目。在rider.net中,我可以使用支持C# 10语法的版本,并且它可以正常工作,但是当我使用msbuild从命令行构建相同的项目时,它会失败。即使我将语言版本设置为最新,它仍无法编译。 - boggy
@costa 我在想这是因为它仍然会通过标志、技巧、黑客的组合来构建? - Sabuncu
@Sabuncu - 我已经修复了,因为在发布设置中没有添加<LangVersion>,这就是我使用msbuild时的目标。 - boggy

3
我做了以下操作,解决了我的问题:
  1. create a file named "Directory.Build.props" in the solution directory and writing this code:

    <Project>
     <PropertyGroup>
      <LangVersion>latest</LangVersion>
     </PropertyGroup>
    </Project>
    
  2. Deleted the .vs folder (it is hidden in the solution directory)

  3. Restart the Visual Studio


1
在我的情况下,我必须从我的.csproj文件中删除<ImplicitUsings>enable</ImplicitUsings>行。

1
我从头开始使用 dotnet new classlibdotnetstandard2.0。但是 dotnet msbuild -restore ... 失败了,显示错误信息为 error CS8370: Feature 'global using directive' is not available in C# 7.3。你真是救了我的一天! - ursa
1
我从头开始使用 dotnet new classlibdotnetstandard2.0。但是 dotnet msbuild -restore ... 失败了,显示错误信息 error CS8370: Feature 'global using directive' is not available in C# 7.3。你真是救了我一天的工作! - undefined

0

请检查两台机器上的配置是否有效(Debug/Release,x64/Any CPU)。这也可能导致此错误。


0
如果您安装了ReSharper,它会自动为您修改csproj文件 ;)

-2

你必须在 *.csproj 文件中的 PropertyGroup 之一中忘记这个标签。

<LangVersion>8.0</LangVersion>

1
这个修复已经在问题本身中说明了。 - Lance U. Matthews

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接