Supposons que j'ai plusieurs différents record
-types avec une interface commune, comme suit:
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; }
}
Mon but est d'écrire une fonction pour mettre à jour la propriété Tag via record clonation.
Maintenant, si le type était connu, je pourrais écrire quelque chose comme ceci:
private Rec2 Update(Rec2 rec, string tag)
{
return rec with { Tag = tag };
}
Cependant, je voudrais éviter d'écrire un tas de surcharges, alors je me demandais si il n'y a plus générique moyen pour y parvenir. Par exemple, j'avais tenté d'écrire que:
private TRec Update<TRec>(TRec rec, string tag) where TRec : IFoo
{
return rec with { Tag = tag };
}
mais ça ne compile pas, parce que TRec
pourrait être n'importe quoi (class
, struct
, etc), et pas seulement une record
où je peux utiliser l' with
l'énoncé. En passant, il n'y a pas un record
-contrainte, je pourrait s'appliquer.
Donc, est-il une solution de contournement? est-il rien à attendre d'être résolu à l'avenir?
Comme une question bonus (juste pour le plaisir de la curiosité), pourquoi un record
-traduit de classe n'est pas marquée par une interface spéciale, afin de rendre le with
instruction de travail contre?