gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:01:04 25 4
gpt4 key购买 nike

是否可以使用 C# 7.0 中的 ref 返回功能定义一个通用函数,该函数可以对一个对象的两个实例中的字段进行比较和更新?我正在想象这样的事情:

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, thing2, (Thing t) => ref t.field2);

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

最佳答案

您将无法使用 Func,因为它不会通过引用返回结果。您需要创建一个使用 ref 返回的新委托(delegate):

public delegate ref TResult RefReturningFunc<TParameter, TResult>(TParameter param);

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

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

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

关于c# - C# 7.0 中的泛型函数和 ref 返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45760265/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com