6

我有很多类似的方法:

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

“相似”意味着它们具有完全相同的方法标头,但方法名称除外。我还有几个接受 R、G、B 值的“colourPicker”控件。

我正在尝试创建一个接受方法作为其参数之一的方法,如下所示:

UpdateColourPicker(ColorPicker cp, CustomMethod cMethod)

并按如下方式调用它:

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

outAction一起的正确语法是什么?我已经看过这个问题,但我仍然没有解决。

谢谢!

4

2 回答 2

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不能Funcoutand一起使用ref。这仅仅是因为Action并且Func只是在 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);
    }
}
于 2012-06-12T12:24:28.577 回答
2

如果你想定义一个没有参数的泛型委托,应该这样做:

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

显然 BCL 中的ActionFunc代表与此签名不匹配。

于 2012-06-12T12:30:43.847 回答