簡體   English   中英

是否可以僅限制記錄的方法?

[英]Is it possible to constrain a method for records only?

假設我有幾種不同的record類型,它們具有一個通用接口,如下所示:

record Rec1(
    string Tag
    ) : IFoo;

record Rec2(
    int Num,
    string Tag
    ) : IFoo;

record Rec3(
    bool Flag
    ) : IFoo
{
    public string Tag { get; init; }
    public double Value { get; init; }
}

// ... others ...

interface IFoo
{
    string Tag { get; }
}

我的目標是編寫一個 function 通過記錄克隆更新 Tag 屬性。

現在,如果類型是已知的,我可以這樣寫:

    private Rec2 Update(Rec2 rec, string tag)
    {
        return rec with { Tag = tag };
    }

但是,我會避免編寫一堆重載,所以我想知道是否有更通用的方法來實現這一點。 例如,我很想寫成:

    private TRec Update<TRec>(TRec rec, string tag) where TRec : IFoo
    {
        return rec with { Tag = tag };
    }

但這不會編譯,因為TRec可以是任何東西( classstruct等),而不僅僅是我可以使用with語句的record 順便說一句,我沒有可以申請的record限制。

那么,有什么解決方法嗎? 未來有什么可以解決的嗎?

作為一個額外的問題(只是為了好奇),為什么record翻譯的 class 沒有標記特殊接口,以使with語句不工作?

讓所有這些記錄繼承自實現您的接口的共享基本記錄,而不是有一個空的基本記錄:

record R : IFoo ...

record Rec1 : R....
record Rec2 : R....

private TRec Update<TRec>(TRec rec, string tag) where TRec : R
{
    return rec with { Tag = tag };
}

感謝另一個答案(請參閱評論中的鏈接),這似乎是一個 hacky 解決方法:

record R();

record Rec1(
    string Tag
    ) : R, IFoo;

// ... others ...

interface IFoo
{
    string Tag { get; init; }
}

private TRec Update<TRec>(TRec rec, string tag) where TRec : R, IFoo
{
    return rec with { Tag = tag };
}

由於R記錄,約束是有效的,而Tag分配歸功於init訪問器。

再一次,對我來說,這更像是一個 hack,而不是一個真正的解決方案。 我希望看到一些本機支持。

暫無
暫無

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

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