具有Action<>的“Out”参数(引用)

时间:2012-06-12 12:21:32

标签: c# .net

我有很多类似的方法:

 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的正确语法是什么? 我看过this question,但我还没有管理。

谢谢!

2 个答案:

答案 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);

很遗憾,正如您所链接问题的回答中所述,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);
    }
}

答案 1 :(得分:2)

如果要定义带有out参数的泛型委托,则应该这样做:

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

显然,BCL中的ActionFunc代表与此签名不符。