C# DoesNotReturnAttribute不会将调用后的代码标记为无法访问

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");

我正在阅读文档并编写一些测试代码来检查新特性。对于DoesNotReturn属性:

编译器将调用该方法后的任何代码标记为不可访问,直到遇到适当的catch子句为止

因此,我编写了以下代码来测试它:

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并且启用了可空上下文。我刚刚编辑了我的帖子并添加了这些细节。