C#编译器抛出语言版本(LangVersion)引用错误:“C# 7.3的'nullable'值无效:'启用'”。

41

我有几个.NET Standard项目的解决方案,我想要启用类似下面这样的C# 8和可空特性:

<PropertyGroup>
    <TargetFramework>netstandard2.1</TargetFramework>
    <LangVersion>8.0</LangVersion>
    <Nullable>enable</Nullable>
  </PropertyGroup>

注意:这些设置可以在你的 .csproj 文件中找到。

问题是有些项目编译正常,而有些则出现错误:

C# 7.3 的可空值无效:请使用语言版本“preview”或更高版本的“启用”

我正在使用 Visual Studio 16.2 预览版 2 和 .NET Core 3 预览版 6。这是预览版中的 bug 还是我的操作有误?


你使用的是 <LangVersion>8.0</LangVersion> 而不是 <LangVersion>preview</LangVersion>。请参考此页面了解如何指定 previewlatest 等版本。 - Rufus L
预览时出现错误信息是相同的。 - dnf
1
没有问题。我也使用 8.0 版本。你那些失败的项目中是否有 global.json 文件,并指向一个更早的 SDK? - Panagiotis Kanavos
为了复现,我将我的代码放在了Github上 - 例如这个项目正在失败 - https://github.com/bigdnf/HomeCenter/blob/Core3/Core/HomeCenter.Model/HomeCenter.Model.csproj。我不记得有任何全局变量。 - dnf
6个回答

43
在我的情况下,当我将目标框架从.NET Standard 2.1更改为.NET Standard 2.0时,我在使用Visual Studio 2022遇到了这个问题。我通过在.csproj文件中删除<Nullable>enable</Nullable>并重新启动Visual Studio来解决了我的问题。
原始的.csproj文件:
<PropertyGroup>
  <TargetFramework>netstandard2.1</TargetFramework>
  <Nullable>enable</Nullable>
</PropertyGroup>

新的 .csproj 文件:

<PropertyGroup>
  <TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>

不需要重新启动 Visual Studio 17.5.3。 - Tom Andraszek
哇,这是我见过的最令人困惑但又准确的错误信息! - Simon_Weaver
顺便说一句,如果这是一个你刚刚创建的新项目,在你进行此修复之前已经从另一个项目中引用过,那么你可能需要删除该引用并重新添加。我不得不这样做来绕过一些非常烦人的关于命名空间找不到的错误消息。 - Simon_Weaver

18

正如错误信息所建议的那样,您应该尝试使用 <LangVersion>preview</LangVersion>


预览时错误信息相同。 - dnf
1
此时此刻,preview 的版本是 8.0 - Panagiotis Kanavos
直到发布后才被认为是8.0。 - Avin Kavish
如果您右键单击项目,导航到“属性”>>“生成”>>“高级”>>“语言版本”,您会注意到Visual Studio没有提供UI来更改该值。您可能需要导航到所有解决方案下的所有项目的csproj文件(通过在Visual Studio中右键单击每个项目并选择“卸载项目”来打开csproj文件)。添加<LangVersion>preview</LangVersion>。此设置将帮助您的最新C#编译器根据您的项目目标框架确定默认语言版本。 - crakama

4
我遇到了这样的错误:“无效的‘nullable’值:对于C# 7.3,请使用语言版本‘8.0’或更高版本”。通过更改指定的目标框架的顺序,我成功地解决了它。
将 net6.0;net48 改为 net48;net6.0

3

当我需要将C#语言的编译时支持版本从11.0降级到7.0时,我遇到了同样的问题。我通过将“enable”替换为“disable”解决了我的.net 7.0项目问题,并能够在VS2022中编译它。

请参见最终项目配置:

<PropertyGroup>
   <TargetFramework>net7.0</TargetFramework>
   <ImplicitUsings>disable</ImplicitUsings>
   <Nullable>disable</Nullable>
   <LangVersion>7.0</LangVersion>
</PropertyGroup>

这对我来说很有效。 - Miad BayaniRad

2

还有另一种解决方案...在项目文件中添加一些条件,仅针对支持新的可空特性的目标框架使用它。

这里有一篇优秀的文章here...所有代码片段的引入归功于作者:

<!-- Set the LangVersion = 8 -->
<PropertyGroup>
    <TargetFrameworks>netstandard2.0;netstandard2.1</TargetFrameworks>
    <LangVersion>8.0</LangVersion>
</PropertyGroup>

<!-- Only enable nullable feature for the supported frameworks -->
<PropertyGroup Condition=" '$(TargetFramework)' != 'netstandard2.0' ">
    <Nullable>enable</Nullable>
</PropertyGroup>

然后隐藏不受支持的框架中的警告消息:

<PropertyGroup Condition=" $(Nullable) != 'enable' ">
  <NoWarn>$(NoWarn);CS8632</NoWarn>
</PropertyGroup>

1
为了解决这个问题,您需要执行以下步骤:
  1. 在Visual Studio中,右键单击项目文件,选择“属性”
  2. 选择“生成”-->“事件”-->“高级”-->取消选中“确定性” here
现在重新构建项目即可。

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