繁体   English   中英

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

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

outAction的正确语法是什么? 我看过这个问题,但我还没有管理。

谢谢!

从该链接的答案中获取提示,这将起作用:

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);
    }
}

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM