如何正确使用C# 8.0中的switch case语句

3

我尝试实现了C# 8.0的switch-case语句,但不幸的是它没有工作,

如果case被满足,我想返回一个特定的字符串来表示满足该case的switch表达式。

以下是我的代码:

public static void GetErrMsg(Exception ex) =>
   ex switch
   {
       ex is UserNotFoundException => "User is not found.",
       ex is NotAuthorizedException => "You'r not authorized."
   };

但我得到了以下消息:

错误 CS0201 仅赋值、调用、增量、减量、等待和新对象表达式可用作语句。

错误 CS0029 无法将类型为“bool”的值隐式转换为“System.Exception”


请注意,这些错误信息是由编译器生成的,可能需要检查代码以找出问题所在。

1
“=>“ “User is not found.” 不返回 void,而是返回 string - MakePeaceGreatAgain
CS0201 是因为你的 GetErrMsg 方法返回的是 void,而不是 string。至于 CS0029,请参见 @Marc 的答案。 - canton7
1个回答

10

也许类似这样:

    public static string GetErrMsg(Exception ex) =>
       ex switch
       {
           UserNotFoundException _ => "User is not found.",
           NotAuthorizedException _ => "You'r[e] not authorized.",
           _ => ex.Message, // or something; "Unknown error" perhaps
       };

这里的_是一个丢弃符号;如果你实际上想要使用检测到类型中的其他内容,你可以给它命名,例如:

这里的_代表忽略;如果你想要使用检测到的类型中其他的东西,你可以给它取个名字,例如:

UserNotFoundException unfe => $"User is not found: {unfe.UserName}",

非常感谢您的回复。我有一个问题想问您,为什么在 => 前面添加下划线 _?我查看了文档,没有看到它被这样使用。而且如果没有那行代码,它甚至无法正常工作。另外,您从 unfe 访问 .UserName 的那一行看起来很酷,为了能够做到这一点,我之前是否需要将 UserName 存储到该变量中呢?这部分看起来很有趣,您能多写一点关于它的内容吗?非常感谢! - Roxy'Pro
1
@Roxy'Pro,就像我在编辑中所说的:_是一个舍弃符号;类型检测的一般模式是 {DetectType} {localName} - 就是说:C#接受 _ 作为“呵呵,无所谓”的特殊情况,适用于多种场景,即“我不会去尝试访问它,你可以随意处理”。与编辑中的最后一行进行比较和对比,我声明了一个新的本地名称来存储已排序的值,然后从中访问一个值。 - Marc Gravell
谢谢回复!我该如何为例如用户名添加值,以便我可以从UserNotFoundException中访问它。看起来很棒。 - Roxy'Pro
1
@Roxy'Pro 喜欢这样的代码吗?public class UserNotFoundException : Exception { public string UserName { get; } public UserNotFoundException(string userName) : base("You shall not pass!") => UserName = userName; }(抱歉格式有点密集;注释无法更清晰) - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接