C# DoesNotReturnAttribute不会将调用后的代码标记为无法访问
我正在阅读文档并编写一些测试代码来检查新特性。对于DoesNotReturn属性: 编译器将调用该方法后的任何代码标记为不可访问,直到遇到适当的catch子句为止 因此,我编写了以下代码来测试它:C# DoesNotReturnAttribute不会将调用后的代码标记为无法访问,c#,c#-8.0,C#,C# 8.0,我正在阅读文档并编写一些测试代码来检查新特性。对于DoesNotReturn属性: 编译器将调用该方法后的任何代码标记为不可访问,直到遇到适当的catch子句为止 因此,我编写了以下代码来测试它: using System; using System.Diagnostics.CodeAnalysis; class Program { static void Main(string[] args) { Console.WriteLine("Start");
using System;
using System.Diagnostics.CodeAnalysis;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Start");
var resMsg = SomeMethod();
Console.WriteLine($"resMsg: {resMsg}");
}
[DoesNotReturn]
static string SomeMethod()
{
throw new Exception("Some test exception");
}
}
我期望编译器在SomeMethod调用后的下一行检测到类似无法访问代码的警告,但没有任何警告。为什么?
编辑:
该项目使用C 8.0
已启用可为空的上下文
以下是*.csproj文件的全部内容:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<LangVersion>8.0</LangVersion>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="SixLabors.ImageSharp" Version="1.0.0-rc0001"/>
<PackageReference Include="SixLabors.ImageSharp.Drawing" Version="1.0.0-beta0007"/>
</ItemGroup>
</Project>
升级语言版本会选择C 8.0,但不会启用可为空的注释上下文或可为空的警告上下文。重新生成项目以确保它在生成时没有警告
如第2段所述:
所有示例都假定为C8.0或更新版本,并且代码位于可为空的上下文中
因此,您需要检查.csproj文件,并确保启用了可空上下文
...
使可能
8
不旋转的测试。编译器会给你一个警告吗?我所测试的,没有。见下文 这个会产生警告
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Start");
throw new Exception("Some test exception");
var resMsg = SomeMethod();
Console.WriteLine($"resMsg: {resMsg}");
}
static string SomeMethod()
{
throw new Exception("Some test exception");
}
}
而这一个没有
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Start");
//throw new Exception("Some test exception");
var resMsg = SomeMethod();
Console.WriteLine($"resMsg: {resMsg}");
}
static string SomeMethod()
{
throw new Exception("Some test exception");
}
}
我相信该属性只与NRT分析有关,而与一般代码可达性无关。@JonSkeet您能告诉我NRT分析的含义吗?我试图用谷歌搜索这个术语,但没有发现与可编程的空引用类型分析有任何关联。与中一样,它只是关于处理c8可为null的引用类型。@JonSkeet,老实说,我不知道这个属性与可为null的引用类型分析有什么关系。如何使用它以及我如何使用它?您链接到的整个页面都是关于可空引用类型分析的。标题为保留属性有助于编译器的空状态静态分析。如果您觉得不需要使用这些,您可能不需要。对不起,我忘了提到项目已经指向C 8.0并且启用了可空上下文。我刚刚编辑了我的帖子并添加了这些细节。