gpt4 book ai didi

c# - 模式匹配机制有哪些限制?

转载 作者:太空狗 更新时间:2023-10-29 22:57:11 27 4
gpt4 key购买 nike

我个人只知道dynamic不能用在模式匹配上,有点可惜:(

dynamic foo = 10;
switch(foo) {
case int i:
break;
}

此外,有值的元组/新元组不能用于模式匹配:

dynamic foo = (420, 360);
switch(foo) {
case (int, int) i:
break;
}

它已在当前版本的 C#7 中删除,并分配给将来使用。

还有哪些我不能做的事情?

最佳答案

C# 7 中的新模式匹配功能包括以下内容:

  • 支持类型切换,
  • var 模式的简单使用,
  • 向 case 语句添加 when 保护,
  • x is T y 模式表达式。

您的示例侧重于其中的第一个。而类型切换很可能是这些新功能中最受欢迎和最常用的。虽然存在局限性(例如您提到的那些局限性),但可以使用其他功能来解决其中的许多局限性。

例如,您的第一个限制很容易通过将 foo 装箱到 object 来解决:

dynamic foo = 10;
switch ((object)foo)
{
case int i:
Console.WriteLine("int");
break;
default:
Console.WriteLine("other");
break;
}

将按预期打印 int

var 模式和守卫可用于解决您的第二个限制:

dynamic foo = (420, 360);
switch (foo)
{
case var ii when ii.GetType() == typeof((int, int)):
Console.WriteLine("(int,int)");
break;
default:
Console.WriteLine("other");
break;
}

将打印(int,int)

另外,值元组可以用于类型切换,你只需要使用长手语法:

var foo = (420, 360);
switch (foo)
{
case ValueTuple<int,int> x:
Console.WriteLine($"({x.Item1},{x.Item2})");
break;
default:
Console.WriteLine("other");
break;
}

以上将打印(420,360)

就我个人而言,C# 7 中模式匹配的最大限制是缺少使用 match 关键字的模式匹配表达式。最初,此版本计划执行以下操作,但结果为 pulled due to time constraints :

var x = 1;
var y = x match (
case int _ : "int",
case * : "other"
);

这可以通过使用 switch 来解决,但是很麻烦:

var x = 1;
var y = IntOrOther(x);

...

private string IntOrOther(int i)
{
switch (i)
{
case int _ : return "int";
default: return "other";
}
}

但是这里有许多第 3 方模式匹配库的帮助,例如我自己的 Succinc<T> library , 让我们把它写成:

var x = 1;
var y = x.TypeMatch().To<string>()
.Caseof<int>().Do("int")
.Else("other")
.Result();

它不如使用 match 关键字好,但在该功能出现在以后的语言版本中之前,它是一个可选的解决方法。

要真正理解 C# 7 施加的限制,值得引用 pattern matching spec on GitHub并将其与下一个 C# 版本中的内容进行比较。尽管如此,很明显所有这些都有变通办法。

这个问题最初是封闭的,因为它是开放式的,目前的措辞。举几个愚蠢的例子,C# 7 的模式匹配的限制是它不会让你成为一杯完美的咖啡,或者让你在几秒钟内飞越世界......但我更愿意回答问题的精神。答案确实是唯一的限制是你的想象力。如果您不让它限制您,那么必须考虑到变通方法具有可读性和/或性能影响这一事实。它们可能是现实世界中唯一的限制。

关于c# - 模式匹配机制有哪些限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42017665/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com