如何正确使用C#8.0开关盒

如何正确使用C#8.0开关盒,c#,exception,error-handling,switch-statement,c#-8.0,C#,Exception,Error Handling,Switch Statement,C# 8.0,我曾尝试过实现c#8.0交换机,但不幸的是,它无法正常工作, 我想知道case是否满足,以便在switch表达式中为满足条件的case返回一个特定字符串 这是我的密码: public static void GetErrMsg(Exception ex) => ex switch { ex is UserNotFoundException => "User is not found.", ex is NotAuthorize

我曾尝试过实现c#8.0交换机,但不幸的是,它无法正常工作, 我想知道case是否满足,以便在switch表达式中为满足条件的case返回一个特定字符串

这是我的密码:

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”隐式转换为 “系统异常”


也许是这样的:

public静态字符串GetErrMsg(异常ex)=>
防爆开关
{
UserNotFoundException \=>“找不到用户。”,
NotAuthorizedException=>“您未经授权。”,
_=>例如消息,//或者什么;“未知错误”也许
};
这里的
\uu
是一个丢弃;如果您确实想使用检测到的类型中的其他内容,可以将其命名,例如:

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

=>“未找到用户。”
不返回
void
,但
string
CS0201
是因为
GetErrMsg
方法返回
void
,而不是
string
。有关
CS0029
,请参阅@Marc的回复非常感谢您的回复。我有一个问题要问你,为什么在
=>
之前添加下划线
,我看过文档,没有看到它是这样使用的。没有这条线它甚至不能工作。您从unfe访问
.UserName
的那一行看起来很酷,能够做到我以前应该以某种方式将
UserName
存储到该变量中,或者?那部分看起来很有趣,你能再多写一点吗。谢谢你,伙计!请转告@正如我在编辑中所说的那样:
\uu
是一种放弃;像这样的类型测试的一般模式是
{DetectType}{localName}
-just:C#接受
作为一系列场景中“meh,不在乎”的特例,即“我不打算尝试访问它,你做你需要的任何事情”。将其与编辑中的最后一行进行比较和对比,在编辑中,我为键入的值声明了一个新的本地名称,然后从中访问一个值。谢谢回复!我如何将值(例如username)添加到该类型的值中,以便可以从UserNotFoundException访问它。看起来awesome@Roxy'Pro like
public class UserNotFoundException:Exception{public string UserName{get;}public UserNotFoundException(string UserName):base(“您不能通过!”)=>UserName=UserName;}
?(很抱歉,格式太密集;注释不允许使用cleaner)