C#将如何切换语句';的默认标签处理可为null的枚举

本文关键字:标签 默认 处理 枚举 null 何切换 语句 | 更新日期: 2023-09-27 17:59:55

C#开关语句的默认标签将如何处理可为null的枚举?

默认标签会捕获null和任何未处理的情况吗?

C#将如何切换语句';的默认标签处理可为null的枚举

如果它为null,它将到达默认标签。

public enum YesNo
{
    Yes,
    No,
}
public class Program
{
    public static void Main(string[] args)
    {
        YesNo? value = null;
        switch (value)
        {
            case YesNo.Yes:
                Console.WriteLine("Yes");
                break;
            case YesNo.No:
                Console.WriteLine("No");
                break;
            default:
                Console.WriteLine("default");
                break;
        }
    }
}

程序将打印default

除非处理了null。

public class Program
{
    public static void Main(string[] args)
    {
        YesNo? value = null;
        switch (value)
        {
            case YesNo.Yes:
                Console.WriteLine("Yes");
                break;
            case YesNo.No:
                Console.WriteLine("No");
                break;
            case null:
                Console.WriteLine("NULL");
                break;
            default:
                Console.WriteLine("default");
                break;
        }
    }
}

打印CCD_ 2。

如果您有后来添加的未处理枚举值:

public enum YesNo
{
    Yes,
    No,
    FileNotFound,
}
public class Program
{
    public static void Main(string[] args)
    {
        YesNo? value = YesNo.FileNotFound;
        switch (value)
        {
            case YesNo.Yes:
                Console.WriteLine("Yes");
                break;
            case YesNo.No:
                Console.WriteLine("No");
                break;
            default:
                Console.WriteLine("default");
                break;
        }
    }
}

它仍然打印default

您可以为null设置一个大小写。

switch (MyNullableEnum)
{
   case Option1:
       break;
   case Option2:
       break;
   case Option3:
       break;
   case null:
       break;
   default:
       break;
}

您可以使用空合并运算符??null开关值路由到default:以外的特定事例标签

public static IEnumerable<String> AsStrings(this IEnumerable<Char[]> src)
{
    Char[] rgch;
    var e = src.GetEnumerator();
    while (e.MoveNext())
    {
        switch ((rgch = e.Current)?.Length ?? -1)
        {
            case -1:    // <-- value when e.Current is 'null'
                yield return null;
                break;
            case 0:
                yield return String.Empty;
                break;
            case 1:
                yield return String.Intern(new String(rgch[0], 1));
                break;
            default:   // 2...n
                yield return new String(rgch);
                break;
        }
    }
}

值得一提的是,C#8.0为开关表达式引入了一个新的属性模式。现在,您可以使用下划线来实现切换的默认逻辑:

public double Calculate(int left, int right, Operator op) =>
    op switch 
{
    Operator.PLUS => left + right,
    Operator.MINUS => left - right,
    Operator.MULTIPLY => left * right,
    Operator.DIVIDE => left / right,
    _    =>  0 // default
}

参考。https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8