C#7.0中的泛型函数和ref返回

是否可以在C#7.0中使用ref returns功能定义一个泛型函数,它可以在Object的两个实例中同时进行字段的比较和更新?我想象的是这样的:
void UpdateIfChanged<TClass,TField>(TClass c1,TClass c2,Func<TClass,TField> getter)
{
    if (!getter(c1).Equals(getter(c2))
    {
        getter(c1) = getter(c2);
    }
}

用途示例:

Thing thing1 = new Thing(field1: 0,field2: "foo");
Thing thing2 = new Thing(field1: -5,field2: "foo");
UpdateIfChanged(thing1,thing2,(Thing t) => ref t.field1);
UpdateIfChanged(thing1,(Thing t) => ref t.field2);

有没有办法指定一个Func类型或任何类型的泛型类型限制,通过要求getter返回引用来使其有效?我尝试了Func< TClass,ref TField>,但它似乎不是有效的语法.

解决方法

您将无法使用Func,因为它不会通过引用返回结果.您需要创建一个使用ref return的新委托:
public delegate ref TResult RefReturningFunc<TParameter,TResult>(TParameter param);

然后更改您的函数以使用该委托就足以使其工作:

public static void UpdateIfChanged<TClass,RefReturningFunc<TClass,TField> getter)
{
    if (!getter(c1).Equals(getter(c2)))
    {
        getter(c1) = getter(c2);
    }
}

请注意,不能通过引用返回属性.您可以通过引用或任何其他变量返回字段,但属性不是变量.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...