case when
是相当新的东西,所以没有很多答案。 MSDN示例是关于强制转换对象的,而不是使用原始字符串。
switch (catName)
{
case string c when c.StartsWith("Fluffy"):
// DoSomething
break;
}
这似乎可行,如果您可以省略string c
部分,而只需执行when catName
,那就更好了。但随后有多种情况不起作用:
switch (catName)
{
case string c when c.StartsWith("Fluffy"):
case string c when c.StartsWith("Mr"):
// DoSomething
break;
}
因为您不能声明两个string c
。因此,您可以更改第二个,但最终会得到一串看起来不太好的字符串a,b,c等的列表。
理想的方式当然是:
switch (catName)
{
case when catName.StartsWith("Fluffy"):
...
break;
}
是否有解决此问题的优雅方法,或者使用if..else if
方法是否更好?
不,您不能,因为您使用的是the pattern matching into the switch statement,并且类型是在编译时求值的:
expr的编译时类型是类型的基类
无论如何,您可以使用相同的变量名,因为它们的作用域是本地的。 Reference
我知道您说过两个不同的字符串不是很好,但是对我来说这看起来很可读,这样做真的有问题吗?
string catName = "Fluffy";
switch (catName)
{
case string c when c.StartsWith("Fluffy"):
case string d when d.StartsWith("Mr"):
Console.WriteLine(catName);
break;
default:
Console.WriteLine("Name does not start with Mr or Fluffy.");
break;
}
或者,根据Krustys答案中的链接,您可以这样做:
string catName = "Noodle";
switch (catName)
{
case string c when (c.StartsWith("Fluffy") || c.StartsWith("Mr")):
Console.WriteLine(catName);
break;
default:
Console.WriteLine("Name does not begin with Mr or Fluffy.");
break;
}