我有很多类似的方法:
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
的正确语法是什么?
我看过this question,但我还没有管理。
谢谢!
答案 0 :(得分:3)
从相关答案中获取提示,这将有效:
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);
}
}
答案 1 :(得分:2)
如果要定义带有out参数的泛型委托,则应该这样做:
delegate void ActionWithOutparameter<T>(out T x);
delegate void ActionWithOutparameter<T1, T2>(out T1 x, out T2 y);
// ...
显然,BCL中的Action
和Func
代表与此签名不符。