2017-06-20 67 views
1

我有一個簡單的例子,我想使用模式匹配來識別我需要用來執行兩個通用Octrees之間的碰撞測試的算法。我的基本情況是兩個八角形的三角形。代碼的骨架是。C#7中的模式匹配應該與泛型一起工作嗎?

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 
     ) 
     { 
      ... 
     } 


} 

但會導致以下錯誤。

enter image description here

Error CS8121 
An expression of type Octree<T> cannot be handled by a pattern of type 
Octree<Triangle>. 

當然我可以只使用typeof(U)typeof(T)做測試,但我認爲上述應該真正發揮作用。爲什麼不呢?

回答

0

有一個解決bug /功能的工作。您可以使用Try *模式和內聯聲明的outvariables。

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(); 

}  
2

在C#7.0中的模式匹配有一個要求,說明必須有從左側類型到右側類型的顯式或隱式轉換。

在C#7.1中,規範將被展開,以便左側或右側可以是開放類型。

相關問題