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」コントロールがあります。

次のように、パラメータの1つとしてメソッドを受け入れるメソッドを作成しようとしています。

UpdateColourPicker(ColorPicker cp, CustomMethod cMethod)

そしてそれを次のように呼びます:

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

一緒outに正しい構文は何ですか?Action私はこの質問を見ましたが、まだ管理していません。

ありがとう!

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とは機能しFuncません。これは単に、BCLのジェネリックスで記述されたデリゲート定義(さまざまなオーバーロードを提供するためにかなりの回数)であるためです。バリアントを追加すると、すぐに再定義コンパイラエラーが発生します。outrefActionFuncrefout

完全なサンプル:

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);
// ...

明らかに、BCLActionのとFuncデリゲートはこの署名と一致しません。

于 2012-06-12T12:30:43.847 に答える