是否可以限制仅用于记录的方法?

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; }
}

我的目标是编写一个函数来通过记录克隆更新标签 属性。

现在,如果知道类型,我可以这样写:

    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 等),而不仅仅是我可以使用的 record with 语句。顺便说一下,我没有可以应用的 record-约束。

那么,有什么解决方法吗?有什么期待在未来解决的吗?

作为一个额外的问题(只是出于好奇),为什么 record 翻译的 class 没有标记特殊接口,以便 with声明反对?

感谢另一个答案(参见评论中的 link),这似乎是一个 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 记录,约束有效,而由于 init 访问器,Tag 赋值。

同样,对我来说更像是黑客而不是真正的解决方案。我希望看到一些本地支持。

让所有这些记录都继承自实现您的接口的共享基础记录,而不是空的基础记录:

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 };
}