簡體   English   中英

C#7中的模式匹配是否可以與泛型一起使用?

[英]Should pattern matching in C# 7 work with generics?

我有一個簡單的情況,我想使用模式匹配來識別在兩個通用八進制之間執行碰撞測試所需的算法。 我的基本情況是兩個三角形的八進制。 代碼的框架是。

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)進行測試,但我認為以上內容確實可以工作。 為什么不呢?

C#7.0中的模式匹配有一項要求,要求必須從左手類型到右手類型進行顯式或隱式轉換。

在C#7.1中,將對規范進行擴展,以便左側或右側可以是開放類型。

它是一個錯誤。 看看這個: https : //github.com/dotnet/roslyn/issues/16195

有一個解決該錯誤/功能的方法。 您可以將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();

}    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM