Předpokládejme, že mám několik různých record
-typy se společným rozhraním, a to následovně:
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; }
}
Mým cílem je napsat funkci pro aktualizaci Tag majetku prostřednictvím záznamu clonation.
Nyní, pokud typ byl známý, mohl bych napsat něco jako toto:
private Rec2 Update(Rec2 rec, string tag)
{
return rec with { Tag = tag };
}
Nicméně, já bych se zabránilo napsat pár přetížení, takže jsem přemýšlel, jestli tam je více obecný způsob, jak dosáhnout, že. Například bych v pokušení napsat jako:
private TRec Update<TRec>(TRec rec, string tag) where TRec : IFoo
{
return rec with { Tag = tag };
}
ale to nezkompiluje, protože TRec
mohlo by to být cokoliv (class
, struct
atd.), ne jen record
kde mohu použít with
prohlášení. Mimochodem, tam je ne record
-omezení, které bych mohl použít.
Takže, je tam nějaké řešení? je to něco očekávat, že bude vyřešena v budoucnosti?
Jako bonus otázku (jen pro čistě ze zvědavosti), proč record
-přeloženo třída není označena speciální rozhraní, aby with
prohlášení proti?