【发布时间】:2017-09-10 03:42:14
【问题描述】:
我正在查看 C# 7 的新 switch 语句,虽然我可以将类型作为模式匹配的一部分进行切换,这很棒,但我想知道是否可以避免在我已经知道的情况下重新声明类型?
例子:
private static void BetterSwitchCase(string s)
{
switch (s)
{
case string x when x.Length == 3 && int.TryParse(x, out int i):
Console.WriteLine($"s is a string that parses to {i}");
break;
default:
Console.WriteLine("No Match.");
break;
}
}
在这里,我的 case 语句重新声明了 string x,即使我打开的类型已经是一个字符串,我只关心它是 Length 还是 int.TryParses。
只是省略它不会编译:
// Syntax error, ':' expected
case when s.Length == 3 && int.TryParse(s, out int i):
// A constant value is expected
case s when s.Length == 3 && int.TryParse(s, out int i):
所以我只是想知道是否有办法省略它,或者它只是我必须接受的模式匹配语法的一部分。
【问题讨论】:
-
我不认为这是一个很好的模式匹配用例——一个简单的
if或三元表达式就可以了。 -
@Dai 在这种情况下,绝对是。我更多地考虑是否存在多种条件(例如,如果由于设计不良的 API 而必须打开一堆错误消息(甚至可能是本地化的错误消息))。目前,if-cascade 或谓词字典都可以使用,但新的 switch 语法是另一种可能使用的工具。
标签: c# pattern-matching c#-7.0