[英]“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)
out
和Action
的正確語法是什么? 我看過這個問題,但我還沒有管理。
謝謝!
從該鏈接的答案中獲取提示,這將起作用:
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);
不幸的是,正如您鏈接的問題的答案中所述, Action
和Func
不能與out
和ref
。 這只是因為Action
和Func
只是在BCL中使用泛型聲明的委托定義(相當多次提供不同的重載)。 添加ref
和out
變體會很快導致重新定義編譯器錯誤。
完整樣本:
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中的Action
和Func
代理與此簽名不匹配。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.