首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模式匹配中的元组解构

模式匹配中的元组解构
EN

Stack Overflow用户
提问于 2022-02-18 06:35:27
回答 1查看 321关注 0票数 0

经过长时间的休息之后,我正在研究c#中的新内容,并试图了解泛型类型匹配是如何工作的。同时,我想知道是否有可能解构模式中的元组,例如:

代码语言:javascript
复制
string SendIt<T>(T p) => p switch
{
    ValueTuple<int, int> t => $"int point {t.Item1}, {t.Item2}", // <- this works
    (float x, float y)     => $"float point {x}, {y}",           // <- this doesn't
    _                      => $"dunno, type={typeof(T)}",
};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-18 07:17:54

does not work的情况下,您试图将完全未知的东西(没有任何约束的T)解构成两个元素。在这种情况下,编译器将尝试在某个地方搜索static void Deconstruct<T>(this T val, out float x, out float y)失败(无论如何,我无法想象这样的函数对于绝对未指定的T是怎样的)。所以,它不会编译。

第一行(编译)使用强制转换,因此它将只在运行时处理所有(如果强制转换不可能,它就不会进入分支)。

至于元组解构的问题,那么我们就开始-修正元组的声明,明确地说它是一个元组,里面有两个元素。

代码语言:javascript
复制
string SendIt<T1, T2>(Tuple<T1, T2> p) => p switch
{
    (float x, float y) => $"float point {x}, {y}", 
    _ => $"dunno, type={typeof(T)}",
};

Console.WriteLine(SendIt(Tuple.Create(2f,3f))); //float point 2, 3
Console.WriteLine(SendIt(Tuple.Create(2,"test"))); //dunno, type=System.Int32

我们还可以进一步采用cast方法,所以

代码语言:javascript
复制
string SendIt<T>(T p) => p switch
{
    ValueTuple<int, int> t => $"int point {t.Item1}, {t.Item2}", 
    Tuple<float, float>(float x, float y) => $"float point {x}, {y}", 
    _ => $"dunno, type={typeof(T)}",
};

Console.WriteLine(SendIt(ValueTuple.Create(1,2))); // int point 1, 2
Console.WriteLine(SendIt(Tuple.Create(1f,2f))); //float point 1, 2

Console.WriteLine(SendIt(Tuple.Create(1,2))); dunno, type=System.Tuple`2[System.Int32,System.Int32]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71169302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档