在泛型函数中赋值类属性

本文关键字:属性 赋值 泛型 函数 | 更新日期: 2023-09-27 18:09:42

我有以下代码。

A a = new A(....); .... a.Prop1 = ...
B b = new B(....); .... b.Prop1 = ...
DoSth(a.Prop1, b.Prop1); 
void DoSth<T>(T curr, T prev) 
{
    if (!EqualityComparer<T>.Default.Equals(curr, prev))
    {
        prev = curr; // prev changed, however b is not changed.
        ....
        callSomeFn(b); 
    .....
}

传递一个赋值lambda应该可以工作。

void DoSth<T>(T curr, T prev, Action assign) 
{
    if (!EqualityComparer<T>.Default.Equals(curr, prev))
    {
        assign();
    .....
}
DoSth(a.Prop1, b.Prop1, ()=>a.Prop1 = b.Prop1); 

然而,它看起来相当麻烦。有更好的方法吗?(ref不能用于对象属性)

在泛型函数中赋值类属性

让我们把泛型拿出来。假设类型为int。你会有:

void DoSth(int curr, int prev) 
{
    if (!EqualityComparer<int>.Default.Equals(curr, prev))
    {
        prev = curr;
    .....
}
DoSth(a.Prop1, b.Prop1);

为什么你期望"prev = curr"影响方法范围之外的任何东西?你将一个局部变量赋值给另一个局部变量。

假设这实际上是你想要的,我怀疑你想在参数上使用ref关键字。

我可能过分简化了它,但是像这样的东西不会工作吗?

T DoSth<T>(T curr, T prev) 
{
    if (!EqualityComparer<T>.Default.Equals(curr, prev))
    {
        return curr;
    }
    return prev
}
a.Prop1 = DoSth(a.Prop1, b.Prop1);