讓我們假設我有幾個不同的record-types 和一個通用的介面,如下所示:
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; }
}
我的目標是撰寫一個函式來通過記錄克隆更新 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,等),不只是一個record,我可以使用with的陳述句。順便說一句,record我沒有可以應用的約束。
那么,有什么解決方法嗎?未來有什么可以解決的嗎?
作為一個額外的問題(只是為了好奇),為什么一個record-translated 的類沒有用特殊的介面標記,以便使with陳述句與之相反?
uj5u.com熱心網友回復:
不是有一個空的基本記錄,而是讓所有這些記錄從一個共享的基本記錄繼承,它實作了你的介面:
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 };
}
uj5u.com熱心網友回復:
感謝另一個答案(請參閱評論中的鏈接),這似乎是一種黑客的解決方法:
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訪問者。
再一次,對我來說更像是一個黑客而不是一個真正的解決方案。我更愿意看到一些本地支持。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/363411.html
