簡體   English   中英

帶有Action <>的“Out”參數(引用)

[英]“Out” parameter (reference) with Action<>

我有很多類似的方法:

 void GetColorSky(out float r, out float g, out float b)
 void GetColorGround(out float r, out float g, out float b)

“類似”意味着它們具有完全相同的方法標題,不包括方法名稱。 我還有幾個“colourPicker”控件,它們接受R,G,B值。

我正在嘗試創建一個接受方法作為其中一個參數的方法,如下所示:

UpdateColourPicker(ColorPicker cp, CustomMethod cMethod)

並將其稱為如下:

UpdateColourPicker(cpSky, GetColorSky)
UpdateColourPicker(cpGround, GetColorGround)

outAction的正確語法是什么? 我看過這個問題,但我還沒有管理。

謝謝!

從該鏈接的答案中獲取提示,這將起作用:

public delegate void GetColorDel(out float r, out float g, out float b);

void UpdateColourPicker(ColorPicker cp, GetColorDel cMethod) { }

UpdateColourPicker(cpSky, GetColorSky);
UpdateColourPicker(cpGround, GetColorGround);

不幸的是,正如您鏈接的問題的答案中所述, ActionFunc不能與outref 這只是因為ActionFunc只是在BCL中使用泛型聲明的委托定義(相當多次提供不同的重載)。 添加refout變體會很快導致重新定義編譯器錯誤。

完整樣本:

class Program
{        
    public delegate void GetColorDel(out float r, out float g, out float b);

    static void Main(string[] args)
    {
        UpdateColourPicker(null, GetColorSky);
        UpdateColourPicker(null, GetColorGround);

        Console.Read();
    }

    static void GetColorSky(out float r, out float g, out float b) 
    {
        r = g = b = 0f;
        Console.WriteLine("sky"); 
    }

    static void GetColorGround(out float r, out float g, out float b) 
    {
        r = g = b = 0f;
        Console.WriteLine("ground"); 
    }

    static void UpdateColourPicker(object cp, GetColorDel cMethod) 
    {
        float r, g, b;
        cMethod(out r, out g, out b);
    }
}

如果要使用out參數定義泛型委托,則應該這樣做:

delegate void ActionWithOutparameter<T>(out T x);
delegate void ActionWithOutparameter<T1, T2>(out T1 x, out T2 y);
// ...

顯然,BCL中的ActionFunc代理與此簽名不匹配。

暫無
暫無

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

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