C# 可为null的引用类型的注释只能在'#可为空';上下文
刚刚下载了VS2019并创建了一个控制台应用程序来试用新的C#8空引用类型。将项目切换为使用LangVer C#8构建(目前显示为beta版) 然后,以下代码将导致警告C# 可为null的引用类型的注释只能在'#可为空';上下文,c#,c#-8.0,nullable-reference-types,C#,C# 8.0,Nullable Reference Types,刚刚下载了VS2019并创建了一个控制台应用程序来试用新的C#8空引用类型。将项目切换为使用LangVer C#8构建(目前显示为beta版) 然后,以下代码将导致警告 class Program { static void Main(string[] args) { string? message = "Hello World"; string message2 = null;
class Program
{
static void Main(string[] args)
{
string? message = "Hello World";
string message2 = null;
Console.WriteLine(message);
Console.WriteLine(message2);
// The annotation for nullable reference types should only be used in code within a '#nullable' context
}
}
这到底意味着什么?对于任何来到这里的人来说。
您可以将#nullable enable
放在文件的顶部,采用@Marc在注释中建议的逐文件方法
您还可以使用#nullable enable/disable的组合来仅注释文件的一部分
class Program
{
static void Main(string[] args)
{
#nullable enable
string? message = "Hello World";
#nullable disable
string message2 = null;
Console.WriteLine(message);
Console.WriteLine(message2);
}
}
这里有一个指向文档的链接。
可空上下文支持对编译器解释引用类型变量的方式进行细粒度控制。任何给定源行的可为空的注释上下文处于启用或禁用状态。您可以将C#8.0之前的编译器视为在禁用的可空上下文中编译所有代码:任何引用类型都可能为空。还可以启用或禁用可为空的警告上下文。可为空的警告上下文指定编译器使用其流分析生成的警告
可以使用.csproj
文件中的可空元素为项目设置可空注释上下文和可空警告上下文。此元素配置编译器如何解释类型的可空性以及生成哪些警告。有效设置包括:
:启用
- 已启用可为空的批注上下文。已启用可为空的警告上下文
- 引用类型的变量,例如
,是不可为空的。所有可空性警告均已启用string
:警告
- 可为空的批注上下文已禁用。已启用可为空的警告上下文
- 引用类型的变量是不可见的。所有可空性警告均已启用
:注释
- 已启用可为空的批注上下文。可为空的警告上下文已禁用
- 引用类型的变量,例如
,是不可为空的。所有可空性警告均已禁用string
:禁用
- 可为空的批注上下文已禁用。可为空的警告上下文已禁用
- 引用类型的变量是不可见的,就像早期版本的C#。所有可空性警告均已禁用
.csproj
文件中,只需在相关的
元素中添加enable
(对于每个项目配置名称,您的项目文件可能有单独的
元素)
因此,您的项目文件应如下所示:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
Exe
netcoreapp3.1
使可能
要将可为空的消息显示为错误而不是警告,请将其添加到项目文件中:
CS8600;CS8602;CS8603
…就像这样:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<Nullable>enable</Nullable>
<WarningsAsErrors>CS8600;CS8602;CS8603</WarningsAsErrors>
</PropertyGroup>
</Project>
Exe
netcoreapp3.1
使可能
CS8600;CS8602;CS8603
相应的完整信息包括:
- CS8600:正在将null文本或可能的null值转换为不可为null的类型
- CS8602:可能取消对空引用的引用
- CS8603:可能的空引用返回
:将可空注释上下文和可空警告上下文设置为已启用#可空启用
:将可空注释上下文和可空警告上下文设置为禁用#可空禁用
:将可空注释上下文和可空警告上下文还原到项目设置#可空还原
:将可为空的警告上下文设置为禁用#可为空的禁用警告
:将可空警告上下文设置为已启用#可空启用警告
:将可为空的警告上下文还原到项目设置#可为空的还原警告
:将可空批注上下文设置为禁用#可空禁用批注
:将可空批注上下文设置为已启用#可空启用批注
:将批注警告上下文还原到项目设置#可空还原批注
请注意,C#8.0和Visual Studio 2019的预发行版本也支持
safeonly
,但在最终发布的C#8.0中不存在。此外,预发布版本使用了#pragma warning restore nullable
,但发布版本使用了#nullable restore warnings
,我也遇到了同样的错误,我花了几天时间来解决它,原因是其他答案没有说明:有特殊的(未记录的?)Roslyn C#编译器中的规则用于生成使用可空特性的代码,直到我将Visual Studio 2019升级到最新版本(16.4+),错误消息与上面的错误消息完全相同-尽管在我的项目文件中启用了
但在最新版本的Visual Studio 2019中,他们将错误消息升级为:
警告CS8669:可为Null的引用类型的注释只能在“#nullable”注释上下文中的代码中使用自动生成的代码需要在源代码中有一个明确的“#nullable”指令。
(强调添加到错误消息的新添加部分。)
因此,如果您在发出的任何.generated.cs
文件中看到此错误消息,则这些文件需要显式添加#nullable enable
——Roslyn显然总是忽略项目级别