[英]“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.