我有一个简单的例子,我想使用模式匹配来识别我需要用来在两个普通的Octree之间执行碰撞测试的算法。我的基本案例是两棵三角形的八叉树。代码的骨架是。
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
)
{
...
}
}但会导致以下错误。

Error CS8121
An expression of type Octree<T> cannot be handled by a pattern of type
Octree<Triangle>.当然,我可以使用typeof(U)和typeof(T)来进行测试,但是我认为上面的测试应该是真的。为什么不呢?
发布于 2017-06-26 07:41:22
关于bug/特性还有一项工作要做。您可以在内联声明的外部变量中使用Try*模式。
bool TryIs<TU>(object t, out TU u)
{
if (t is TU uu)
{
u = uu;
return true;
}
u = default(TU);
return false;
}然后你可以像这样使用它
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();
} 发布于 2017-06-20 10:35:14
在C# 7.0中,模式匹配有一个要求,即必须有从左侧类型到右侧类型的显式或隐式转换。
在C# 7.1中,规范将被扩展,这样左侧或右侧都可以是开放类型。
发布于 2017-06-20 10:33:48
https://stackoverflow.com/questions/44650508
复制相似问题