簡體   English   中英

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

[英]Generic functions and ref returns in C# 7.0

是否可以在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, thing2, (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, TField>(TClass c1, TClass c2, RefReturningFunc<TClass, TField> getter)
{
    if (!getter(c1).Equals(getter(c2)))
    {
        getter(c1) = getter(c2);
    }
}

請注意,不能通過引用返回屬性。 您可以通過引用或任何其他變量返回字段 ,但屬性不是變量。

您需要為它聲明自己的委托類型。 例如:

using System;

public class Thing
{
    public int field1;
    public string field2;    
}

public delegate ref TOutput FuncRef<TInput, TOutput>(TInput input);

public class Test
{
    public static void Main()
    {
        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);
    }

    static void UpdateIfChanged<TInput, TOutput>(TInput c1, TInput c2, FuncRef<TInput, TOutput> getter)
    {
        if (!getter(c1).Equals(getter(c2)))
        {
            getter(c1) = getter(c2);
        }
    }
}

(注意到處使用“field”而不是“property”。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM