注意:这里i只用在 if 语句来定义它,所以 Preview 4 可以将这个处理的很好。
我们计划允许以 a* 为形式的“通配符”作为输出参数,这会让你忽略了你不关心参数:
p.GetCoordinates(out int x, out *); // I only care about x
Note:在 C#7.0 中是否会包含通配符还不确定。
模式匹配
C# 7.0 引入了模式概念。抽象地讲,模式是句法元素,能用来测试一个数据是否具有某种“形”,并在被应用时,从值中提取有效信息。
C#7.0 中的模式示例:
•C 形式的常量模式(C是C#中的常量表达式),可以测试输入是否等于C
•T X 形式的类型模式(T是一种类型、X是一个标识符),可以测试输入是否是T类型,如果是,会将输入值提取成T类型的新变量X
•Var x 形式的 Var 模式(x是一个标识符),它总是匹配的,并简单地将输入值以它原本的类型存入一个新变量X中。
这仅仅是个开始 - 模式是一种新型的 C# 中的语言元素。未来,我们希望增加更多的模式到 C# 中。
在 C#7.0,我们正在加强两个现有的具有模式的语言结构:
•is 表达式现在具有一种右手侧的模式,而不仅仅是一种类型
•switch 语句中的 case 语句现在可以使用匹配模式,不只是常数值
在 C#的未来版本中,我们可能会增加更多的被用到的模式。
具有模式的 IS 表达式
下面是使用 is 表达式的示例,其中利用了常量模式和类型模式:
public void PrintStars(object o)
{
if (o is null) return; // constant pattern "null"
if (!(o is int i)) return; // type pattern "int i"
WriteLine(new string('*', i));
}
正如你们看到,模式变量(模式引入的变量)和早前描述的输出变量比较类似,它们可以在表达式中间声明,并在最近的范围内使用。就像输出变量一样,模式变量是可变的。
注:就像输出变量一样,严格范围规则适用于Preview 4。
模式和 Try方法可以很好地协同:
if (o is int i || (o is string s && int.TryParse(s, out i)) { /* use i */ }
具有模式的 Switch 语句
我们正在归纳 Switch 语句:
•可以设定任何类型的 Switch 语句(不只是原始类型)
•模式可以用在 case 语句中
•Case 语句可以有特殊的条件
下面是一个简单的例子:
switch(shape)
{
case Circle c:
WriteLine($"circle with radius {c.Radius}");
break;
case Rectangle s when (s.Length == s.Height):
WriteLine($"{s.Length} x {s.Height} square");
break;
case Rectangle r:
WriteLine($"{r.Length} x {r.Height} rectangle");
break;
default:
WriteLine("<unknown shape>");
break;
case null:
throw new ArgumentNullException(nameof(shape));
}










