[英]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
可以是任何東西( class
, struct
等),而不僅僅是我可以使用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.