刚刚下载了VS2019并创建了一个控制台应用程序来试用新的C# 8空引用类型。将项目切换为使用lang ver C# 8构建(目前显示为测试版)
然后,下面的代码将产生一个警告。
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
}
}
这到底是什么意思?
发布于 2019-04-03 18:04:36
在这里结束的任何人。您可以将#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);
}
}
这里有一个文档的链接。https://docs.microsoft.com/en-us/dotnet/csharp/nullable-references#nullable-contexts
可空上下文允许对编译器如何解释引用类型变量进行细粒度控制。任何给定源代码行的可空注释上下文被启用或禁用。您可以将C# 8.0之前的编译器视为在禁用的可空上下文中编译所有代码:任何引用类型都可能为空。还可以启用或禁用可空警告上下文。可空的警告上下文指定由编译器使用其流分析生成的警告。
可以使用.csproj
文件中的nullable元素为项目设置可空注释上下文和可空警告上下文。此元素配置编译器如何解释类型的可空性以及生成哪些警告。有效设置为:
enable
:string
是不可为空的。所有可为空性警告均为enabled.warnings
:annotations
:string
是不可为空的。所有可为空性警告均为disabled.disable
:在您的.csproj
文件中,只需在相关的<PropertyGroup>
元素中添加<Nullable>enable</Nullable>
(对于每个项目配置名称,您的项目文件可能有单独的<PropertyGroup>
元素)。
因此,您的项目文件应如下所示:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
要将可为空的消息显示为错误而不是警告,请将以下内容添加到项目文件中:
<WarningsAsErrors>CS8600;CS8602;CS8603</WarningsAsErrors>
...like so:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<Nullable>enable</Nullable>
<WarningsAsErrors>CS8600;CS8602;CS8603</WarningsAsErrors>
</PropertyGroup>
</Project>
对应的完整消息为:
null type.
您还可以使用指令在项目中的任何位置设置这些相同的上下文:
#nullable enable
:将可空注释上下文和可空警告上下文设置为enabled.#nullable disable
:将可空注释上下文和可空警告上下文设置为disabled.#nullable restore
:将可空注释上下文和可空警告上下文恢复为项目settings.#nullable disable warnings
:将可空警告上下文设置为disabled.#nullable enable warnings
:将可空警告上下文设置为enabled.#nullable restore warnings
:将可空警告上下文恢复为项目settings.#nullable disable annotations
:将可为空的批注上下文设置为disabled.#nullable enable annotations
:将可为空的批注上下文设置为enabled.#nullable restore annotations
:将批注警告上下文恢复为项目设置。默认情况下,可空注释和警告上下文处于禁用状态。这意味着您的现有代码无需更改即可编译,也不会生成任何新的警告。
请注意,C# 8.0和Visual Studio2019的预发布版本也支持safeonly
,但最终发布的C# 8.0中没有this option has since been removed和。此外,预发布版本使用#pragma warning restore nullable
,但发布版本使用#nullable restore warnings
。
发布于 2019-12-24 03:50:18
我也遇到了同样的错误,我花了几天的时间与之抗争,原因是其他答案没有描述:有特殊的(未记录的?)在我将Visual Studio2019升级到最新版本(16.4+)之前,尽管我的项目文件中有<Nullable>enabled</Nullable>
,但错误消息与上面的毫无帮助的消息完全相同。
但在Visual Studio 2019的最新版本中,他们已经将错误消息升级为:
警告CS8669:可为only的引用类型的批注应仅在“# nullable”批注上下文中的代码中使用。自动生成的代码需要在源代码中显式地使用‘#nullable’指令。
(强调添加到错误消息的新添加部分。)
因此,如果你在你正在发送的任何.generated.cs
文件中看到这个错误消息,那么这些文件需要显式地添加#nullable enable
- Roslyn显然总是忽略生成代码的项目级<Nullable>enable</Nullable>
设置。
https://stackoverflow.com/questions/55492214
复制相似问题