簡體   English   中英

是否可以在 F# 中為參數化泛型類型定義擴展方法(就像在 C# 中一樣)

[英]Is it possible to define extension methods for parameterized generic types in F# (like in C#)

在 C# 中,我可以定義一個僅適用於參數化泛型類型的擴展方法:

public static bool fun(this List<int> coll, int x)
{
    return coll.Contains(x);
}

我在 F# 中嘗試了同樣的方法,但發現沒有辦法這樣做:

type List<'k when 'k :> int32> with
    member o.x s = o.Contains s

這會引發錯誤 FS0660:此代碼的通用性低於其注釋所要求的,因為無法泛化顯式類型變量“k”。 它被限制為“int32”。

當然可以定義一個通用的擴展方法,比如

type List<'k> with
    member o.x s = o.Contains s

並附注使該擴展方法在 C# 中可用。但這不是這里的問題。 我擔心參數化泛型 function。我相信它只能在 C# 中聲明,但不能在 F# 中聲明。

我得出結論,在 C# 中,擴展方法是函數,而在 F# 中,類似的概念是作為類型擴展實現的,而參數化的 generics 是無類型的,所以這是不可能的。

我是否正確,在 F# 中沒有辦法做同樣的事情?

這里有一個類似的問題: Is it possible to define a generic extension method in F#? 但11年過去了,我再次提出這個話題。

F# 具有定義“C# 兼容”擴展的機制,並且您的用例被特別調出,請查看此處

這樣的事情應該有效:

open System.Collections.Generic
open System.Runtime.CompilerServices

[<Extension>]
type Extensions =
    [<Extension>]
    static member inline ContainsTest(xs: List<int>, s: int) = 
        xs.Contains(s)

暫無
暫無

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

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