是否可以限制仅用于记录的方法?
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
可以是任何东西(class
、struct
等),而不仅仅是我可以使用的 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 };
}
假设我有几个不同的 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
可以是任何东西(class
、struct
等),而不仅仅是我可以使用的 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 };
}