public enum Test { Yes, No }

我有这两个switch的表达方式.下面的一个给出了CS8509警告:

Test? test = null;
var result = test switch
{
    null => "Null",
    Test.Yes => "Yes",
    Test.No => "No",
};

但将null个 case 移到最后可以解决这个问题.有人知道为什么会发生这种事吗?这肯定是个窃听器,对吧?

Test? test = null;
var result = test switch
{
    Test.Yes => "Yes",
    Test.No => "No",
    null => "Null",
};

项目设置:

<PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <LangVersion>10.0</LangVersion>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
    <NoWarn>8524</NoWarn>
</PropertyGroup>

推荐答案

在GitHub上发现了这台issue,问题非常相似.决议案如下:

从与团队成员的讨论来看,这是精心设计的.编译器的promise 是提供诊断,但具体是哪种诊断是一个保留的问题,我们在这方面保持灵活性.

您已经禁用了(至少)这里可能的两个警告中的一个,因此您得到了这种不一致的行为.同样的情况也可以反过来复制:

#pragma warning disable CS8509

// no warning 
static void F(Test? test) {
    var result = test switch
 {
     null => "Null",
     Test.Yes => "Yes",
     Test.No => "No",
 };
}

// warning 
static void F(Test? test) {
    var result = test switch
 {
     Test.Yes => "Yes",
     Test.No => "No",
     null => "Null",
 };
}

演示@sharplab

Csharp相关问答推荐

System.Text.Json Utf8JsonReader正在读取数组值两次

System.Data.SQLite:判断SQLite数据库是否为空(任何表中至少有一行)

如何从顶部提取发票号作为单词发票后的第一个匹配

`Task`只有在C#中等待时才会运行吗?

如何注册实现同一接口的多个服务并注入到控制器构造函数中

C#DateTime.ToString在ubuntu和centos中返回不同的结果

如何模拟耐久任务客户端在统一测试和获取错误在调度NewsListationInstanceAsync模拟设置

自动映射程序在GroupBy之后使用项目

无法通过绑定禁用条目

调用Task.Run()与DoSomethingAsync()有什么不同?

Linux Docker上的.NET6在某个时间抛出后,在加密操作期间发生System.Security.Cryptography.CryptographicException:错误

如何在.NET Maui中将事件与MVVM一起使用?

CRL已过期,但ChainStatus告诉我RevocationStatus未知

C#LINQ子字符串

序列化过程中的死循环

C#中使用ReadOnlySpan的泛型类型推理

仅在Blazor Web App中覆盖生产的基本路径(.NET8中的_Hosts.cshtml文件功能?)

Xamarin中出错.表单:应用程序的分部声明不能指定不同的基类

将列表转换为带有逗号分隔字符串形式的值的字典

读取测试项目中的应用程序设置