首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# 7中的模式匹配应该与泛型一起工作吗?

C# 7中的模式匹配应该与泛型一起工作吗?
EN

Stack Overflow用户
提问于 2017-06-20 10:27:22
回答 3查看 1.1K关注 0票数 1

我有一个简单的例子,我想使用模式匹配来识别我需要用来在两个普通的Octree之间执行碰撞测试的算法。我的基本案例是两棵三角形的八叉树。代码的骨架是。

代码语言:javascript
复制
public class Triangle {
        public static bool 
           Intersects
             ( IReadOnlyList<Triangle> ta
             , IReadOnlyList<Triangle> tb)
        {
             ...
        }
}

public class Octree<T> {

        public bool Intersects<U>(Octree<U> other)
        {
            if (this is Octree<Triangle> ota && other is Octree<Triangle> otb)
            {
                return ota.Intersects( otb, Triangle.Intersects );
            }
            throw new NotImplementedException();

        }

        public bool Intersects<U>
          ( Octree<U> other
          , Func<IReadOnlyList<T>, IReadOnlyList<U>, bool> intersectsLeaves
          )
        {
            ...
        }


}

但会导致以下错误。

代码语言:javascript
复制
Error CS8121
An expression of type Octree<T> cannot be handled by a pattern of type
Octree<Triangle>.

当然,我可以使用typeof(U)typeof(T)来进行测试,但是我认为上面的测试应该是真的。为什么不呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-26 07:41:22

关于bug/特性还有一项工作要做。您可以在内联声明的外部变量中使用Try*模式。

代码语言:javascript
复制
bool TryIs<TU>(object t, out TU u)
{
    if (t is TU uu)
    {
        u = uu;
        return true;
    }
    u = default(TU);
    return false;
}

然后你可以像这样使用它

代码语言:javascript
复制
public bool Intersects<U>(Octree<U> other)
{
    if ( TryIs<Octree<Triangle>>(out var ota) && TryIs<Octree<Triangle>>(out var otb))
    {
        return ota.Intersects( otb, Triangle.Intersects );
    }
    throw new NotImplementedException();

}    
票数 1
EN

Stack Overflow用户

发布于 2017-06-20 10:35:14

在C# 7.0中,模式匹配有一个要求,即必须有从左侧类型到右侧类型的显式或隐式转换。

在C# 7.1中,规范将被扩展,这样左侧或右侧都可以是开放类型。

票数 3
EN

Stack Overflow用户

发布于 2017-06-20 10:33:48

是个窃听器。看看这个:https://github.com/dotnet/roslyn/issues/16195

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44650508

复制
相关文章

相似问题

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